有这个代码:
>>> (a, b) = (2, 3)
>>> a
2
>>> b
3
为什么创建元组后变量a和b仍然存在?我的意思是这里:
(a, b) = (2, 3)
创建了一些元组并且该元组未分配给任何变量,因此垃圾收集器应在此行之后立即销毁该元组。
变量a和b只是这个元组的引用 - 所以如果这个元组(a, b)被销毁,那么变量a和b也应该被销毁。
那么为什么在定义元组之后这些变量仍然存在呢?
(a, b) = (2, 3)
不创建元组,而是分配两个变量a
和b
.
它相当于:
a,b = 2,3
并设置a=2
和b=3
“同时”。这很有用,例如在切换变量时:
a,b = b,a
这将设置a=3
和b=2
(如果按顺序完成,则需要一个临时变量)。
解析器不会将(a, b)
其视为元组,尽管它确实会为您进行元组解包。因此,没有要创建的元组,更不用说销毁了。相反,python 将其视为两个单独的变量a
和b
.
如果您要反汇编语句的编译字节码,您可以看到这一点:
>>> 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)
被解包,然后存储到局部变量a
和b
.