按元素索引时交换两个数组元素的奇怪行为
问题描述
我尝试交换数组的元素时遇到奇怪的行为。
初始状态
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]
我认为这两个表达式应该具有相同的结果,因为首先计算赋值的右侧。
在MacOS Catalina 10.15.4上的Python 2.7.16和Python 3.7.6上测试。
注意: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
。
相关文章