2016-12-28 195 views
1

到目前爲止,我的代碼接受來自用戶的輸入,然後將所有這些輸入附加到列表中。將一個列表添加到一個單獨的列表中

list1.append(input1) 

list1.append(input2) 

etc 

然後我追加此列表成爲一個新列表

list2.append(list1) 

所有這一切工作正常,但當我嘗試清除列表1,因此用戶可以爲新的列表1的輸入數據,列表也是從列表2

del list1 [:] 

打印列表2時,那麼只顯示最新列表1清除。有更好的數據結構可供使用嗎?或者,如果代碼的語法不同,這個工作是否會起作用?

理想的結構,我想這個名單已經是:

list2 = [[x, y, z],[a,b,c],[g,h,i]] 

(有我的實際代碼更爲項)

雖然目前它更像是:

list2 = [[], [], [g,h,i]] 

後來我希望能夠識別和打印所有列表,如果他們的第二個項目是「Y」。所以在上面的例子中,將會返回[x,y,z]。這可能使用2D列表嗎?

回答

1

這是因爲名單通過引用傳遞,所以,當你調用list2.append(list1),你真的只是追加到list2list1參考。

所以,如果你修改list1可言,修改可以看出list2

>>> list1 = [1, 2] 
>>> list2 = [list1] 
>>> list1 
[1, 2] 
>>> list2 
[[1, 2]] 
>>> list1.append(3) 
>>> list1 
[1, 2, 3] 
>>> list2 
[[1, 2, 3]] # list1's changes can be seen here 

要解決這個問題,你可以的list1拷貝追加到list2

list2.append(list1[:])

或更優選,僅僅是「復位」的變量list1。取而代之的del list1[:],其中修改就地名單:

list1 = []

0
list2.append(list1) 

list2只是追加list1引用。你需要追加list1的副本。

import copy 
list2.append(copy.copy(list1)) 
2

你有兩個選擇......你可以把任何的list1一個副本list2

list2.append(list1.copy()) # `list1[:]` for older python versions 

或者,而不是清除list1,你可以做一個新的列表:

list2.append(list1) 
list1 = [] # Rather than `del list1[:]` 

這後一個版本將會更常見(和更好的表現),是我想要的解決方案推薦。

+0

「兩個選項」部分是正確答案的唯一途徑。 –

0

相反的list2.append(list1),你應該使用:現在

list2.append(list1[:]) # Or list1.copy() 

list1拷貝追加到list2,而不是list1本身。

輸出:

隨着list2.append(list1)

>>> list2 = [] 
>>> 
>>> list1 = [1, 2, 3] 
>>> list2.append(list1) 
>>> del list1[:] 
>>> 
>>> list1 = [1, 5, 5] 
>>> list2.append(list1) 
>>> 
>>> list2 
[[], [1, 5, 5]] 

隨着list2.append(list1[:])

>>> list2 = [] 
>>> 
>>> list1 = [1, 2, 3] 
>>> list2.append(list1[:]) 
>>> del list1[:] 
>>> 
>>> list1 = [1, 5, 5] 
>>> list2.append(list1[:]) 
>>> 
>>> list2 
[[1, 2, 3], [1, 5, 5]] 
1

原因你獲得這種行爲是因爲你的追加參考list1而不是副本。這是因爲Python列表的工作方式。除非你明確地告訴python到拷貝列表的內容,否則將附加一個列表參考列表。這意味着,說del list1[:]當你還影響list2

這可以通過明確地告訴Python來複制你的列表中的內容要解決的參考list1,而不是簡單地複製到同一列表的引用。

list2.append(list1.copy()) # or list[:] 

對於更復雜的結構,copy.deepcopy()應該使用:

>>> import copy 
... 
>>> list2.append(copy.deepcopy(list1)) 
相關問題