本文主要介绍Python中,a和b交换,a, b = b, a和b, a = a, b不相等的代码及原因。

正常情况:

a, b = b, a

相当于

b, a = a, b

异常情况:

nums = [1, 2, 4, 3]
i = 2
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
print(nums)
# [1, 2, 4, 3]
nums = [1, 2, 4, 3]
i = 2
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
print(nums)
# [1, 2, 3, 4]

两种情况不相等。

文档说明:

将对象赋值给目标列表(可选括在圆括号或方括号中),递归定义如下。

对象必须是一个与目标列表中的目标数量相同的可迭代对象,并且这些项从左到右被分配给相应的目标。

文档地址python.org

nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]

相当于

tmp = nums[nums[i]-1], nums[i]
nums[i] = tmp[0]
nums[nums[i] - 1] = tmp[1]
nums[i], nums[nums[i]-1]
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]

相当于

tmp = nums[i], nums[nums[i]-1]
nums[nums[i] - 1] = tmp[0]
nums[i] = tmp[1]

nums[i]先更新,则nums[nums[i] - 1]引用的索引与nums[i]第二次更新的索引不同。

推荐文档