您尝试做的是在 Python 中称为多重赋值。
考虑以下代码:
[print(0)][0], [print(1)][0] = print(2), print(3)
输出:
2
3
0
1
[print(0)][0] = [print(1)][0] = [print(2)][0] = [print(3)][0]
输出:
3
0
1
2
您可能已经发现,对于这些赋值中的任何一个,右手操作数首先从左到右求值,然后与左操作数一起计算。
它在您提供的代码中的工作方式相同。
i = 1
nums = [-1, 4, 3, 1]
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
在右侧,nums[nums[i]-1] 被计算为 nums[3],得到整数 1,然后nums[i] 被计算为 nums[1],得到整数 4。
现在轮到为左侧操作数赋值了。目前,nums[i] 指代nums[1],因此1 被分配给nums[1]。注意nums[1]现在等于1,然后解释器发现nums[nums[i]-1]指的是nums[1-1],也就是nums[0]!然后将4 分配给nums[0],给你结果[4, 1, 3 ,1]。
但是,如果切换操作数,这个多重赋值的顺序会改变,结果也会不同。同样,评估过程如下:
nums: [-1, 4, 3, 1]
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
nums: [-1, 4, 3, 1]
nums[nums[i]-1], nums[i] = 4, nums[nums[i]-1]
nums: [-1, 4, 3, 1]
nums[nums[i]-1], nums[i] = 4, 1
nums: [-1, 4, 3, 1]
nums[3], nums[i] = 4, 1
nums: [-1, 4, 3, 4]
nums[i] = 1
nums: [-1, 1, 3, 4]