我们在C语言中实现变量交换,往往会使用到通过中间变量来交换两个变量的值:
tmp = x;
x = y;
y = tmp;
而在python中,则无需中间变量即可实现:
x , y = y, x
看起来很神奇,那么具体实现机制是什么呢?
将这个之前,我们先来了解python的多元赋值机制(《python核心编程3.2》)。通常形式是这样的:
x, y , z = 1, 2, 'a string'
采取这种方式的赋值是,等号两边的对象其实都是元祖,即:
(x, y, z) = (1, 2, 'a string')
变量名x, y, z都是引用,内存开辟除了三个空间分别存储1, 2, 'a string',三个变量分别指向这三块地址。由这三个变量构造的元组tuple,它有三个元素,这三个元素并不是x,y,z这三个变量,而是这三个变量所指向的地址空间里的内容。如果此时再另x=4,此时在地址空间会另开辟出一块空间存储4,x进而指向这块空间,而元组内的三个值仍保持不变。
接着我们来解读x, y = y, x, 同样, 它等价于(x, y) = (y, x)。
运行时,首先构造一个元组(y, x),然后构造另一个元组(x, y),接着用元组(y, x)赋值给(x, y),元组赋值过程从左到右,依次进行。假如x=1,y=2,先令x=y,此时x=2,然后令y=x,y等于1。