3 回答

TA貢獻1872條經驗 獲得超4個贊
這是因為對象在 python 內存中的管理方式。雖然您可能定義了兩個不同的變量,但實際上并不是兩個不同的對象。這兩個名稱diff指ids的是 Python 內存中的同一個對象。因此,當您修改一個列表時,您也會修改另一個列表,從而在每次迭代發生時改變 for 循環的過程。我對你的循環做了一些修改,這樣你就明白我的意思了:
ids = [0,1,2,3,4,5,6,7,8,9]
print(id(ids))
for item in ids:
print(item)
diff = ids
print(id(diff))
diff.remove(item)
test = random.sample(diff, 2)
print(test)
我得到前兩次迭代的以下輸出:
140088760329608 ##This is the id for ids in Python's memory
0
140088760329608 ##This is the id for the diff in Python's memory
因此,無論我們如何命名它,修改 diff 或 ids,總是會修改該對象,因此當您調用它(使用 diff 或 ids)時,您將收到相同的修改后的對象。
正如 Collin 建議的那樣,您可以使用以下方法.copy()來防止這種情況發生:
ids = [0,1,2,3,4,5,6,7,8,9]
print(id(ids))
for item in ids:
print(item)
diff = ids.copy()
print(id(diff))
diff.remove(item)
test = random.sample(diff, 2)
print(test)
返回:
140088759855944 ##Object id for ids
0
140088759071496 ##Object id for diffs
創建一個新對象,您可以安全地修改而無需更改另一個對象。

TA貢獻1817條經驗 獲得超6個贊
您正在ids
循環內進行修改,diff = ids
不會創建新對象,只是分配diff
給同一個對象。所以ids
當你修改時你就修改diff
。要解決此問題,請執行以下操作:
diff = ids.copy()
添加回答
舉報