我无法理解这个简单的代码片段幕后发生的事情:
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]
如何按预期更改订单进行交换,反之则完全做了其他事情?
答案 0 :(得分:3)
一般情况下,您不应该使用您要改变的对象来指定要替换的目标位置,否则会非常混乱。
当你这样写:
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)
我认为第一个是最简单的(第二个看起来简单,但只是误导性的。)
答案 1 :(得分:0)
将表情改为
arr[arr[i] - 1], arr[i] = arr[i], arr[arr[i] - 1]
正在为我工作。仍然不知道价值观如何或为何变化。我是python的新手,也很抱歉。