繁体   English   中英

迭代地交换Python中的元素

[英]Swapping Elements in Python Iteratively

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

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)

(有关如何翻译这些内容的详细信息,请参阅参考文档 ,但希望最直接的想法更简单。)

哪个应该明确为什么你得到你的结果。 以及为什么以下所有做你想做的事情:

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)

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

将表达式更改为

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

正在为我工​​作。 仍然不知道价值观如何或为何变化。 我是python的新手,也很抱歉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM