使用一行多赋值在列表中交换元素

Element swapping in list using one line multiple assignment

提问人:gkaz 提问时间:1/17/2021 更新时间:1/17/2021 访问量:1681

问:

我正在尝试交换列表中的 2 个元素。我想将索引 0 处的元素交换为索引 arr[0] 处的元素,所以基本上我想交换 arr[0] <-> arr[arr[0]]。

我一直使用这种方法在索引 i 和 j 之间交换元素:

arr[i], arr[j] = arr[j], arr[i]

但在这种情况下似乎不起作用。如果我这样做:

arr = [1, 2, 3, 4, 5]
arr[0], arr[arr[0]] = arr[arr[0]], arr[0]
print(arr)
[2, 2, 1, 4, 5]

但我希望:

arr = [1, 2, 3, 4, 5]
tmp = arr[arr[0]]
arr[arr[0]] = arr[0]
arr[0] = tmp
print(arr)
[2, 1, 3, 4, 5]

谁能解释这种行为?

Python 列表 交换 多重赋值

评论

2赞 Michael Butscher 1/17/2021
首先评估赋值右侧的元组(从左到右),然后从左到右逐个分配给左侧的元组元素。“arr[0]” 首先获取其新值,因此只需交换每个元组中的顺序即可。
0赞 gkaz 1/17/2021
现在有道理了。我不知道它就是这样执行的。我以为两者都是同时分配的。当我在两个元素 i 和 j 之间进行定期交换时,我没有注意到差异。

答:

0赞 Daniel Hao 1/17/2021 #1

你可以试试这个,看看它对你有什么帮助:

arr = [1, 2, 3, 4, 5]

for i in range(0,len(arr)-1, 2):
    arr[i], arr[i+1] = arr[i+1], arr[i]

print(arr)

输出:

[2, 1, 4, 3, 5]
2赞 Alireza Rahimi 1/17/2021 #2

您应该首先更改 value 然后更改 value 。 所以换个地方就能解决问题。arr[arr[0]]arr[0]

arr = [1, 2, 3, 4, 5]
arr[arr[0]] , arr[0] = arr[0] , arr[arr[0]]
print(arr)

[2, 1, 3, 4, 5]
0赞 CHINNIKALYAN 1/17/2021 #3
arr = [1, 2, 3, 4, 5]
#the prob with your code is you are first assigning the vaue and changing it
arr[arr[0]],arr[0] =arr[0],arr[arr[0]]
print(arr)
[2, 1, 3, 4, 5]

只要颠倒顺序就可以了,现在工作正常了

0赞 ghostshelltaken 1/17/2021 #4

Python 根据位置交换值。当您看到 的操作码时,您将看到我将调用一个名为 的方法。你可以在这里找到它的参考,在这里找到cpython实现。a, b = b, aROT_TWO()

让我们使用前两个索引 0 和 1。

首先,它会将 0 推入堆栈,然后推入 1。现在它弹出了 location(index) 1,在该位置,我们在数组中有值 2。它交换。

现在它弹出 location(index) 0。现在我们在位置 0 处有值 2。这就是为什么我们在索引 0 和 1 处有值 2 的原因。

希望这能回答我们的问题。