使用 [] 来解包 Python 元组

14

我知道解压元组的标准方法是这样的

a, b, c = (1, 2, 3)
# or
(a,b,c) = (1, 2, 3)

但是注意,你可以像这样解包元组

[a, b, c] = (1, 2, 3)

第二种方法是否会因某种强制转换或列表构造而产生额外的费用?是否有一种类似于查看编译器汇编的方式来检查Python解释器处理这个问题的方法?

第二种方法是否由于某种类型转换或者列表构造而产生了额外的开销呢?是否有一种类似于查看编译器汇编的方式来检查Python解释器是如何处理这个问题的呢?

3个回答

17
不,它们都是完全等效的。从经验上看,一种方法是使用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
>>>

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

将对象分配给目标列表,可以选择地用括号或方括号括起来,递归定义如下...


很好的解释和代码分析。 - Daniel Hao

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)

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

1
我使用Linux性能工具检查了执行时间和循环次数。所有三个程序显示相同的执行时间,因此我认为没有额外的成本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接