没有区别。无论您使用哪种 语法 序列,都将生成相同的字节码。
>>> def f():... return 0, 1...>>> import dis>>> dis.dis('[a,b] = f()') 10 LOAD_NAME 0 (f) 2 CALL_FUNCTION 0 4 UNPACK_SEQUENCE 2 6 STORE_NAME 1 (a) 8 STORE_NAME 2 (b) 10 LOAD_ConST 0 (None) 12 RETURN_VALUE>>> dis.dis('(a,b) = f()') 10 LOAD_NAME 0 (f) 2 CALL_FUNCTION 0 4 UNPACK_SEQUENCE 2 6 STORE_NAME 1 (a) 8 STORE_NAME 2 (b) 10 LOAD_ConST 0 (None) 12 RETURN_VALUE>>> dis.dis('a, b = f()') 10 LOAD_NAME 0 (f) 2 CALL_FUNCTION 0 4 UNPACK_SEQUENCE 2 6 STORE_NAME 1 (a) 8 STORE_NAME 2 (b) 10 LOAD_ConST 0 (None) 12 RETURN_VALUE
在每种情况下,您只需调用
f,然后使用
UNPACK_SEQUENCE产生要分配给
a和的值
b。
即使您想证明字节码是CPython的实现细节,链式分配的定义 也不是 。给定
x = [a, b] = f()
含义与
tmp = f()x = tmp[a, b] = tmp
x被分配了
f()(元组)的结果,而不是“ list”的结果
[a, b]。
最后,这是赋值语句的语法:
assignment_stmt ::= (target_list "=")+ (starred_expression | yield_expression)target_list ::= target ("," target)* [","]target ::= identifier | "(" [target_list] ")" | "[" [target_list] "]" | attributeref | subscription | slicing | "*" target
可以说,
"[" [target_list] "]"在Python
3中可以并且应该删除它。鉴于给出的优先选择以避免将来在2到3过渡范围内对Python进行任何更改,这种突破性的更改现在很难实现。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)