1

有这个代码:

>>> (a, b) = (2, 3)
>>> a
2
>>> b
3

为什么创建元组后变量ab仍然存在?我的意思是这里:

(a, b) = (2, 3)

创建了一些元组并且该元组未分配给任何变量,因此垃圾收集器应在此行之后立即销毁该元组。

变量ab只是这个元组的引用 - 所以如果这个元组(a, b)被销毁,那么变量ab也应该被销毁。

那么为什么在定义元组之后这些变量仍然存在呢?

4

2 回答 2

4
(a, b) = (2, 3)

不创建元组,而是分配两个变量ab.

它相当于:

a,b = 2,3

并设置a=2b=3“同时”。这很有用,例如在切换变量时:

a,b = b,a

这将设置a=3b=2(如果按顺序完成,则需要一个临时变量)。

于 2012-09-08T10:44:05.880 回答
3

解析器不会将(a, b)其视为元组,尽管它确实会为您进行元组解包。因此,没有要创建的元组,更不用说销毁了。相反,python 将其视为两个单独的变量ab.

如果您要反汇编语句的编译字节码,您可以看到这一点:

>>> import dis
>>> def foo():
...     (a, b) = (2, 3)
... 
>>> dis.dis(foo)
  2           0 LOAD_CONST               3 ((2, 3))
              3 UNPACK_SEQUENCE          2
              6 STORE_FAST               0 (a)
              9 STORE_FAST               1 (b)
             12 LOAD_CONST               0 (None)
             15 RETURN_VALUE        

常量(2, 3)被解包,然后存储到局部变量ab.

于 2012-09-08T10:43:57.697 回答