3 回答

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個贊
我想你想要
diff = ids.copy()
您所擁有的意思diff
只是指向ids
,因此當(dāng)您從 中刪除元素時diff
,您也會從 中刪除元素ids
。

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個贊
這是因?yàn)閷ο笤?python 內(nèi)存中的管理方式。雖然您可能定義了兩個不同的變量,但實(shí)際上并不是兩個不同的對象。這兩個名稱diff指ids的是 Python 內(nèi)存中的同一個對象。因此,當(dāng)您修改一個列表時,您也會修改另一個列表,從而在每次迭代發(fā)生時改變 for 循環(huán)的過程。我對你的循環(huán)做了一些修改,這樣你就明白我的意思了:
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
因此,無論我們?nèi)绾蚊?,修?diff 或 ids,總是會修改該對象,因此當(dāng)您調(diào)用它(使用 diff 或 ids)時,您將收到相同的修改后的對象。
正如 Collin 建議的那樣,您可以使用以下方法.copy()來防止這種情況發(fā)生:
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
創(chuàng)建一個新對象,您可以安全地修改而無需更改另一個對象。

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