gpt4 book ai didi

python - 在 Python 中迭代交换元素

转载 作者:太空狗 更新时间:2023-10-30 01:19:08 25 4
gpt4 key购买 nike

我无法理解这个简单代码片段的幕后情况:

def changeArray(arr):
for i in range(len(arr)):
arr[i], arr[arr[i] - 1] = arr[arr[i] - 1], arr[i]
print(arr)
return(arr)

代码假定数组的元素是从 1 到 n 的整数。输入为 [1,3,4,2] 时给定代码的输出为:

[1, 3, 4, 2]
[1, 4, 4, 3]
[1, 4, 4, 3]
[1, 4, 4, 3]
Out[8]: [1, 4, 4, 3]

当我期待它打印并返回时:

[1, 3, 4, 2]
[1, 4, 3, 2]
[1, 4, 3, 2]
[1, 2, 3, 4]
Out[8]: [1, 2, 3, 4]

当代码仅交换元素时,为什么值会发生变化?


编辑:

事实证明,更改交换顺序可以解决问题:

def changeArray(arr):
for i in range(len(arr)):
arr[arr[i]-1], arr[i] = arr[i], arr[arr[i]-1]
print(arr)
return(arr)

这给出了以下输出:

[1, 3, 4, 2]
[1, 4, 3, 2]
[1, 4, 3, 2]
[1, 2, 3, 4]
Out[8]: [1, 2, 3, 4]

改变顺序如何按预期进行交换,而相反的顺序完全不同?

最佳答案

一般来说,你不应该使用你正在改变的对象来指定你想要替换的目标位置,否则它会变得非常困惑。

当你这样写的时候:

 arr[i], arr[arr[i] - 1] = arr[arr[i] - 1], arr[i]

大致相当于:

tup = arr[arr[i] - 1], arr[i]
x, y = tup
arr.__setitem__(i, x)
arr.__setitem__(arr[i] - 1, y)

(有关如何翻译的完整详细信息是 in the reference docs,但希望直观的想法简单得多。)

这应该清楚说明您为什么会得到这样的结果。以及为什么以下所有内容都符合您的要求:

x = arr[i] - 1
arr[i], arr[x] = arr[x], arr[i]

arr[arr[i] - 1], arr[i] = arr[i], arr[arr[i] - 1]

def swap(x, y):
arr[x], arr[y] = arr[y], arr[x]
swap(i, arr[i] - 1)

我认为第一个是最简单的(第二个看起来简单,但只是误导性的)。

关于python - 在 Python 中迭代交换元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49472650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com