按元素索引时交换两个数组元素的奇怪行为
Weird behavior swapping two array elements while indexing by elements
我 运行 尝试交换数组元素时出现奇怪的行为。
初始状态
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
。
我 运行 尝试交换数组元素时出现奇怪的行为。
初始状态
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
。