为啥Python交换两个变量的结果不同?(主要是想知道Python交换两个变量的原理)

例子如下:

a = [0, 2, 1, 3, 5, 6]

b = a[:6]  # 浅复制,生成一个与 a 内容相同的列表

a[1], a[a[1] + 1] = a[a[1] + 1], a[1]  # 第一种交换

b[b[1] + 1], b[1] = b[1], b[b[1] + 1]  # 第二种交换

print("第一种交换方式:", a)
print("第二种交换方式:", b)


运行结果:

第一种交换方式: [0, 3, 1, 3, 2, 6]
第二种交换方式: [0, 3, 1, 2, 5, 6]

a[1], a[a[1] + 1] = x,y

等同于

a[1] = x
a[a[1] + 1] =y

先对a[1] 赋值 x
之后执行a[a[1] + 1] =y时再读取a[1]就是赋值之后的了

我明白了。我原本以为对列表交换元素和两个变量交换一样,都是同时赋值的。但是其实你这个列表元素交换有些不一样。虽然原理相同,但会有不同的效果。两个变量交换 x, y = y, x 其实就是 a = x, b = y, x = b, y = a。实现交换的原理是先从等号右边的位置取出两个值,再按顺序给左边赋值。赋值不是同时的,但赋的值不会变化。所以总的来说,赋的值不会随赋值而变化,但你要赋给的那个元素是会随着赋值而变化的

因为a 和 b 是两个不同的内存地址, 所以你交换得到的值肯定是不同的, a , b之间已经没有关系了, 改变都是自己的
a = [0, 2, 1, 3, 5, 6]
取值方式从等号后面开始:
a[1], a[a[1] + 1] = a[a[1] + 1], a[1]
a[1] = a[a[1] + 1] = a[a下标1元素2 + 1] = a[3] = 3
再取等号后 a[1]的值等于 2
也就是这时候a 值 = [0, 3, 1, 3, 5, 6]
等号前的a[a[1] + 1] 内层a[1]的值应该已经是 3 了, 所以得到 a[4] = 2
最后 a = [0, 3, 1, 3, 2, 6]

以此类推b 也就出来了,
计算方式, 等号后的值 会优先取值, 当第一个值被赋值后, 你在等号前取第一个值得到的就是 被赋值后的值

因为你对值相同的变量a,b的交换方式不一样,这两个变量值虽然相同却指向不同的内存地址,修改后都是各自的样子
a,b=c,d等同于a=c,b=d