我遇到了一个奇怪的行为,试图交换一个数组的元素。
i = 1
nums = [0, 1]
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
print(nums) # [0, 1]
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
print(nums) # [1, 0]
我相信这两个表达式的结果应该是一样的,因为赋值的右边是先评估的。
在Python 2.7.16和Python 3.7.6上,在macOS Catalina,10.15.4上测试。
注意 nums[1], nums[0] = nums[0], nums[1]
和 nums[0], nums[1] = nums[1], nums[0]
的工作就像预期的那样。
这是因为赋值左边的参数,仍然是从左到右评估的。让我们来分析一下这个非工作的例子。
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
变成
nums[i], nums[nums[i]-1] = nums[0], nums[1]
成为
nums[i], nums[nums[i]-1] = 0, 1
现在,左手边被评估了,但是 nums[i]
是先评估的。这使得 nums[1]
变成 0
.
现在,如果我们评估 nums[nums[i] - 1]
,我们看到,这可以评价为 nums[0 - 1]
,也就是 nums[-1]
,也就是 nums[1]
.
所以,这整个表达式什么都没有做。它只是设置了 nums[1]
到 0
然后再回到 1
.