[英]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.