2014-04-25 34 views
0

我找不到與我的問題相匹配的任何內容,所以希望這個問題在某個地方尚未提及,我只是太愚蠢而無法找到它。列表索引更改了多個元素

thelist = [] 
a = [0] 
for i in range(5): 
    thelist.append(a) 
print(thelist) 

此時,程序返回[0],[0],[0],[0],[0]

thelist[0].append(1) 
print(thelist) 

附加在這之後我就指望它返回相同但修改,這樣第一個元素:

[[0, 1], [0], [0], [0], [0]] 

居然會發生什麼,就是每件以同樣的方式修改,我得到以下。

[[0, 1], [0, 1], [0, 1], [0, 1], [0, 1]] 

我發現,如果我用a的值替換第2行中的a,那麼一切正常。但是,爲什麼當我多次追加一個變量時這不起作用?

+0

倒數第二行。我的意思是第4行。 – user3574641

回答

0

創建列表時,它將保存對每個位置中同一對象(a)的引用。當你追加到第一個元素時,它實際上會追加到所有「thelist」插槽中。你需要做的是在施工期間的對象的深層副本:

thelist = [] 
a = [0] 
for i in range(5): 
    thelist.append(list(a)) 
print(thelist) 

然後根據需要以下附加將工作。

+0

非常感謝,我認爲很明顯,我沒有那麼有經驗,因爲我不知道這會創建一個參考:) – user3574641

0

thelista都是列表。所以,裏面的for循環要附加一個列表到另一個列表

案例1:一個是列表

thelist = [] 
a = [0] 
for i in range(5): 
    thelist.append(a) 
print(thelist) 

[[0], [0], [0], [0], [0]] 

案例2:一個不是列表,但變量

thelist = [] 
a = 0 
for i in range(5): 
    thelist.append(a) 
print(thelist) 


[0, 0, 0, 0, 0] 
+0

謝謝,但這不是我的問題的答案;)它應該是列表中的一個列表。 – user3574641

0

一是列表中每個項目指向的對象。

如果您希望列表中的每個項目都是不同的對象(具有相同的值),則應在分配對象之前創建一個新對象。最簡單的方法是做:

for i in range(5): 
    thelist.append(list(a)) 

列表功能接收清單,並以相同的內在價值返回一個新的實例。所以你不會每次都改變整個陣列。

+0

非常感謝你:) – user3574641