2012-12-07 123 views
1

可能重複:
Two separate python lists acting as one改變在列表中的字典一個Python列表改變所有列表

此代碼創建列表的字典,按鍵在usens之中。該名單是完全0小號

usens = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 110, 111, 112, 113, 114, 
     115, 116, 117, 118, 119, 302, 303, 306, 307, 308, 370, 371, 500, 
     501, 1000, 1010, 1020, 1100, 1200, 1201, 1202, 2000, 2001, 2002 
     ] 
empty = [[0]*length]*len(usens) 
data = dict(zip(usens, empty)) 
pprint.pprint(data, indent=5) 

data[0][0] += 1 
pprint.pprint(data, indent=5) 

第一個漂亮的打印返回預期(Blurb的刪除):

{0: [0, 0, 0, 0, 0], 
1: [0, 0, 0, 0, 0], 
2: [0, 0, 0, 0, 0], 
3: [0, 0, 0, 0, 0], 
4: [0, 0, 0, 0, 0], 
5: [0, 0, 0, 0, 0], 
..... 
2001: [0, 0, 0, 0, 0], 
2002: [0, 0, 0, 0, 0]} 

然後我做到這一點:data[0][0] += 1,預計第一個列表(索引0),以從1開始,但沒有別的改變。

然而,所有的名單已被修改:

{0: [1, 0, 0, 0, 0], 
1: [1, 0, 0, 0, 0], 
2: [1, 0, 0, 0, 0], 
3: [1, 0, 0, 0, 0], 
4: [1, 0, 0, 0, 0], 
..... 
2001: [1, 0, 0, 0, 0], 
2002: [1, 0, 0, 0, 0]} 

爲什麼,我怎樣才能使它所以只有一個列表被修改?

+0

[兩個單獨的Python列表作爲一個]的可能的重複](http://stackoverflow.com/questions/9969609/two-separate-python-lists-acting-as-one),也見[另一個列表混淆謎題](http://stackoverflow.com/questions/8997559), –

回答

3

empty = [[0]*length]*len(usens)將創建相同的列表,這是從len(usens)列出與相同內容不同的len(usens)副本。

嘗試empty = [[0]*length for i in range(len(usens))]

1

使用*創建副本;對於[0]這很好,因爲它正在複製一個不可變的標量;但外部*創建相同列表的副本(即,複製參考)。你可以使用類似:

empty = [0]*5 
data = {n:list(empty) for n in usens} 

(一個字典理解)來創建列表(如果使用Python 2.7+)。使用list進行復制。

+0

實際上,使用'*'*不會創建副本。缺少副本就是問題所在。你有很多引用相同的列表,而不是你認爲你得到的副本。 – kindall

+0

取決於如何使用單詞「複製」。它創建參考的副本;沒有不同的引用與值的副本(作爲'copy.deepcopy')。如果他說「多個參考」,它可能會更清楚。 – Anorov