2011-12-22 137 views
2

這裏字典的名單怪異的行爲是一個簡單的代碼,在列表執行操作:與蟒蛇

>>> a = [0] * 5 
>>> a 
[0, 0, 0, 0, 0] 
>>> a[0] = 5 
>>> a 
[5, 0, 0, 0, 0] 
>>> 

現在,沒有什麼異常。

現在,我嘗試做相同的字典,而不是整數列表的列表:

>>> a = [{}] * 5 
>>> a 
[{}, {}, {}, {}, {}] 
>>> a[0]['b'] = 4 
>>> a 
[{'b': 4}, {'b': 4}, {'b': 4}, {'b': 4}, {'b': 4}] 
>>> 

我不明白爲什麼我的列表中的所有元素被修改......

有誰能告訴我爲什麼?並提供解決方法?

+1

見對這種行爲進行了深入的解釋[這](http://stackoverflow.com/a/8240157/566644)的答案。 – 2011-12-22 11:46:07

+0

[試圖在一個地方嘗試更改時,值在列表中的多個位置發生更改的可能的副本](http://stackoverflow.com/questions/8240054/value-changing-at-multiple-positions-in-a- list-of-list-when-trying-to-change-at) – geoffspear 2011-12-22 12:21:57

回答

9

這並不奇怪。


解決方法:

a = [{} for i in xrange(5)] 

[…] * 5創建一個和五個指針這列表。

0是一個不可變整數。您不能修改它,你可以與其他整數(如a[0] = 5)替換它。那麼它是一個不同的整數。

{}是一個可變的字典。您正在修改它:a[0]['b'] = 4。它始終是相同的字典。

+1

+1這將創建一個包含5個字典的列表,而不是一個包含5個字典引用的列表。爲什麼? Guido就是這樣做的!字典通過引用進行訪問。 – 2011-12-22 11:14:43

+0

易變性無關吧。 'a [0] = {'b':4}'可以很好地工作;關鍵是原始代碼不會取代字典。 – geoffspear 2011-12-22 12:25:38

+0

-1:這不是「解決方法」。這是「正確使用可變對象」。 – 2011-12-22 13:07:56

0

試試這個,

a = map([].append, {} for i in xrange(3))