a = 10
b = 20
print(a, b) # 10, 20
a = a, b = b, a # How does it work?
print(a, b) # 20, 10... Why?
很明显“a, b = b, a”会交换变量。但是“a =”在这种情况下会做什么以及为什么它不影响输出?
a = 10
b = 20
print(a, b) # 10, 20
# a = a, b = b, a
a, b = b, a
a = a, b
print(a, b) # (20, 10) 10
本质上, a = ... 部分不会改变交换行为。它只是将生成的元组分配回 a。 了解外部赋值的右侧计算结果为由内部赋值创建的元组 (b, a) 是至关重要的。
这种赋值链在 Python 中是合法的,并且每个赋值操作都是从右到左发生的。
但是,虽然这种代码说明了 Python 的赋值行为,但它并不是执行变量交换的最可读或最推荐的方法(根据 PEP)。
使用
dis
模块反汇编你得到的代码。
def foo():
a = 10
b = 20
a = a, b = b, a
import dis
dis.dis(foo)
10 LOAD_FAST 1 (b)
12 LOAD_FAST 0 (a)
14 BUILD_TUPLE 2
16 COPY 1
18 STORE_FAST 0 (a)
20 UNPACK_SEQUENCE 2
24 STORE_FAST 0 (a)
26 STORE_FAST 1 (b)
它首先将(b,a)存储到a中,然后将(b,a)的“旧值”解压到(a,b)中,从而将a覆盖为b而不是元组,本质上是在做
temp = b,a
a = temp
a,b = temp