2012-01-26 150 views
3

我在蟒蛇看起來寫了如下代碼:奇怪的Python行爲

maplist=[{}]*11 
mylist=[0]*11 
maplist[0]['this']=1 
print maplist 

當我打印MAPLIST輸出爲:

[{'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}] 

所預期的那樣:

[{'this': 1}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}] 

,而不是隻有列表的第一個元素應該在地圖中有這個鍵。什麼導致了這個問題?

+0

它是驚人的,我們多長時間得到同樣的問題了微妙的變化......除了標誌事情重複,我開始覺得我們需要有一種方法來創建每個標籤的FAQ。 –

回答

12

當你做到以下幾點:

maplist=[{}]*11 

你結束了十所一個引用同一個字典。這意味着當你修改一本字典時,它們都顯得有變化。

要修復,替換該行:

maplist=[{} for in xrange(11)] 

需要注意的是,由於0是標量,下一行是好的,因爲它是:

mylist=[0]*11 
+0

Ohh第一次遇到這個。 python是否有特定的原因,是否有用? –

+0

@Piyush這只是*操作符在列表中工作的結果。請參閱[本答案](http://stackoverflow.com/a/8240157/566644)以獲得更深入的解釋。 –

3

問題是,當你鍵入

maplist=[{}]*11 

您正在創建11個引用列表,其中包含相同的dict。只有一個字典被創建。

要創建11個不同的字典,你可以做這樣的事情:

>>> maplist = [{} for i in range(11)] 
>>> maplist[0]['this'] = 1 
>>> maplist 
[{'this': 1}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]