a, b = b, a是怎么实现的?

Python里的变量并不直接存储值,是引用一个内存地址。交换变量,其实是交换了引用的地址。

所以,等效于

a, b = b, a

# 等效于

c = (b, a) # 这个 c 是一个临时的元组

a = c[0] # 取出元组中的 b
b = c[1] # 取出元组中的 a

这里的关键是 b, a 是 (b, a) 的简写,实际上中间创建了 (b, a) 的元组来缓存了中间的数据。注:语义上来说,按照上面理解就够了,不过在实现上,Python 解释器为效率考虑会将中间的临时元祖的创建过程优化掉,而不会真实创建一个元组出来,但这并不影响我们的结果和理解。

这也是著名的元祖解包问题