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

问题描述 投票:1回答: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]

我相信这两个表达式的结果应该是一样的,因为赋值的右边是先评估的。

在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] 的工作就像预期的那样。

python python-2.7 python-3.7
1个回答
2
投票

这是因为赋值左边的参数,仍然是从左到右评估的。让我们来分析一下这个非工作的例子。

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.

© www.soinside.com 2019 - 2024. All rights reserved.