gpt4 book ai didi

python - 解包 : [x, y], (x,y), x,y - 有什么区别?

转载 作者:行者123 更新时间:2023-12-03 07:30:03 28 4
gpt4 key购买 nike

在 Python 中,使用 [] 解包函数调用有什么区别? , 与 ()还是一无所有?

def f():
return 0, 1

a, b = f() # 1
[a, b] = f() # 2
(a, b) = f() # 3

最佳答案

没有区别。无论您使用哪种句法序列,都会生成相同的字节码。

>>> def f():
... return 0, 1
...
>>> import dis
>>> dis.dis('[a,b] = f()')
1 0 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()')
1 0 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()')
1 0 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() 的结果(一个元组),而不是“列表” [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 进行任何更改,这样的重大更改现在很难实现。

关于python - 解包 : [x, y], (x,y), x,y - 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64591665/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com