2015-05-19 52 views
0

在編寫python項目時,我發現一個奇怪的行爲,當我嘗試更改另一個列表中的列表值時。更改列表中的列表值時的奇怪行爲

不工作代碼:

lst = [] 
to_add = [None,None,None] 

for i in range(3): 
    lst.append(to_add) 

for i in range(3): 
    lst[i][0] = anotherslistoflists[i][0] 

令我吃驚的這個例子給了意想不到的效果。具體而言,每個lst [i] [0]都被分配了相同的值,該值是「anotherlistoflists」列表的最後一個索引中的第一個元素。

結果示例(打印時LST)

("word1",None,None) 
("word1",None,None) 
("word1",None,None) 

工作代碼:

lst = [] 

for i in range(5): 
    lst.append([None,None,None]) 

# same code as above 

結果示例2(預期結果)

("word1",None,None) 
("word2",None,None) 
("word3",None,None) 

當然,正如你所看到的問題已經解決,但我想知道爲什麼第一個代碼不起作用。 「to_add」列表可能有問題,但我不明白這裏有什麼問題。

回答

1

每次修改不同的名單要附加相同的列表to_add,三次。然後,一旦你修改它,指向它的所有三個項目將反映相同的變化。如果你想創建一個具有相同值的新副本,你可以使用內置的list功能:

for i in range(3): 
    lst.append(list(to_add)) 
+0

好了,所以做列表(to_add)我創造to_add列表的一個新的獨立實例。我現在明白了。謝謝! – pirox22

0

你加入同一個列表,to_addlst

>>> a = [None] 
>>> b = [a] 
>>> c = [a] 
>>> print a, b, c 
[None] [[None]] [[None]] 
>>> a[0] = 1 
>>> print a, b, c 
[1] [[1]] [[1]] 
0

在您不添加的add_to_list副本你實際上補充說,確切的名單遍地的第一種情況,所以當你改變它之後你會改變真實的add_to_list以及指向它的任何地方。在第二種情況下,您要添加每次含None一個新的列表,並通過