用 [ ] 解包 python 元组

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)

从正式语言规范来看,这里有详细说明。这是“目标列表”的一部分,相关引用:

将对象分配给目标列表,可选择括在括号或方括号中,递归定义如下......


Apl*_*123 7

使用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)

所以,它们是相同的,只是语法不同。