2016-05-30 96 views
-2

爲什麼下面的輸出{'a': [1, 3, 4, 5, 6, 7, 8, 9], 'b': [1, 3, 4, 5, 6, 7, 8, 9]}更改字典

adic = {} 
main_array = [1,2,3,4,5,6,7,8,9] 
adic["a"] = main_array 
adic["b"] = main_array 
array = adic["a"] 
array.remove(2) 
print(adic) 

我甚至不指定新陣列的關鍵代碼中的列表。爲什麼應該從字典中的所有數組中自動刪除2。我錯過了一些重要的東西?

+0

您的預期產量是多少?另請參閱[如何在Python中複製或複製列表?](http://stackoverflow.com/q/2612802) –

+1

「我甚至沒有將新數組分配給一個鍵」:這就是要點!沒有新的數組,在整個代碼中只有一個(可變的!)'list'對象。 – schwobaseggl

+0

我沒想到字典中的數組發生了變化。我只希望它改變一次,我已經將陣列重新分配到密鑰 – user2273795

回答

0

你的輸出是這樣做的原因是因爲你設置的每個線路adic['value'] = main_array每個語句都指向main_array的相同內存地址,所以當你做array = adic["a"]時,它也指向相同的內存地址,當你刪除2它從main_array刪除2。因爲你正在從main_array中移除,所以指向main_array的所有東西都會受到影響。

+0

感謝這就是我所期待的。你有什麼解決方案可以實現我正在嘗試做的事情,只改變一個陣列? – user2273795

+0

目前,您只有一個列表(數組是Python中的列表),因此您所做的任何更改都會影響對同一列表的所有引用。如果您希望一個列表不同,那麼您需要複製已提供鏈接的原始列表。 –

+0

您可以執行以下操作來只更改一個數組。 'second_array = copy.deepcopy(main_array)' – Seekheart

1

你所有的引用都指向同一個列表,你可以通過增加檢查:

print(id(adic["a"])) 
print(id(adic["b"])) 
print(id(array)) 
print(id(main_array)) 

在我的系統:

32707888 
32707888 
32707888 
32707888 

分配不創建一個副本。

有幾種方法可以複製一個列表,如果這是你想要的東西,比如

new_list = list(old_list) 

討論here

+0

我並沒有試圖複製一個列表。我試圖做的是拿出一個分配給「a」的數組。然後我會從數組中刪除一個數字,並重新將其重新分配給「a」。但是,我不明白爲什麼它不工作,而是從所有數組中刪除數字。 – user2273795