按元素索引时交换两个数组元素的奇怪行为

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