Phi*_*son 14 python python-3.x iterable-unpacking
我知道解包元组的规范方法是这样的
a, b, c = (1, 2, 3)
# or
(a,b,c) = (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
但注意到你可以像这样解包一个元组
[a, b, c] = (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
由于某种类型的演员表或列表构造,第二种方法是否会产生任何额外费用?有没有办法检查 python 解释器如何处理这个类似于从编译器查看程序集?
jua*_*aga 16
不,这些都是完全等效的。从经验上看这个的一种方法是使用反dis汇编器:
>>> import dis
>>> dis.dis("a, b, c = (1, 2, 3)")
1 0 LOAD_CONST 0 ((1, 2, 3))
2 UNPACK_SEQUENCE 3
4 STORE_NAME 0 (a)
6 STORE_NAME 1 (b)
8 STORE_NAME 2 (c)
10 LOAD_CONST 1 (None)
12 RETURN_VALUE
>>> dis.dis("(a, b, c) = (1, 2, 3)")
1 0 LOAD_CONST 0 ((1, 2, 3))
2 UNPACK_SEQUENCE 3
4 STORE_NAME 0 (a)
6 STORE_NAME 1 (b)
8 STORE_NAME 2 (c)
10 LOAD_CONST 1 (None)
12 RETURN_VALUE
>>> dis.dis("[a, b, c] = (1, 2, 3)")
1 0 LOAD_CONST 0 ((1, 2, 3))
2 UNPACK_SEQUENCE 3
4 STORE_NAME 0 (a)
6 STORE_NAME 1 (b)
8 STORE_NAME 2 (c)
10 LOAD_CONST 1 (None)
12 RETURN_VALUE
>>>
Run Code Online (Sandbox Code Playgroud)
从正式语言规范来看,这里有详细说明。这是“目标列表”的一部分,相关引用:
将对象分配给目标列表,可选择括在括号或方括号中,递归定义如下......
使用godbolt并选择Python语言然后输入三行代码,你可以看到它们都有相同的字节码:
1 0 LOAD_CONST 5 ((1, 2, 3))
2 UNPACK_SEQUENCE 3
4 STORE_NAME 0 (a)
6 STORE_NAME 1 (b)
8 STORE_NAME 2 (c)
2 10 LOAD_CONST 6 ((1, 2, 3))
12 UNPACK_SEQUENCE 3
14 STORE_NAME 0 (a)
16 STORE_NAME 1 (b)
18 STORE_NAME 2 (c)
3 20 LOAD_CONST 7 ((1, 2, 3))
22 UNPACK_SEQUENCE 3
24 STORE_NAME 0 (a)
26 STORE_NAME 1 (b)
28 STORE_NAME 2 (c)
Run Code Online (Sandbox Code Playgroud)
所以,它们是相同的,只是语法不同。