[英]Appending a list to a separate list
到目前為止,我的代碼接受了用戶的輸入,然后將所有輸入附加到列表中。
list1.append(input1)
list1.append(input2)
etc
然后我將此列表追加到新列表中
list2.append(list1)
所有這些工作正常,但是當我嘗試清除list1時,用戶可以為新list1輸入數據,該列表也將從list2中清除。
del list1 [:]
因此,在打印list2時僅顯示最新的list1。 是否有更好的數據結構要使用? 如果代碼的語法不同,還是可以使用?
我希望此列表具有的理想結構是:
list2 = [[x, y, z],[a,b,c],[g,h,i]]
(我的實際代碼中還有更多項目)
雖然目前它更像:
list2 = [[], [], [g,h,i]]
稍后,如果它們的第二個項目為“ y”,我希望能夠識別並打印所有列表。 因此,在上面的示例中,將返回[x,y,z]。 使用2D列表可以嗎?
您有兩個選擇...您可以將list1
的副本放入list2
:
list2.append(list1.copy()) # `list1[:]` for older python versions
或者,除了清除list1
,您還可以創建一個新列表:
list2.append(list1)
list1 = [] # Rather than `del list1[:]`
后一個版本將更常見(並且性能更好),並且是我通常推薦的解決方案。
這是因為名單通過引用傳遞,所以,當你調用list2.append(list1)
你真的只是一個附加參考list1
到list2
。
因此,如果您完全修改了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 = []
。
出現此行為的原因是因為您將引用附加到list1
而不是副本。 這是因為Python列表的工作方式。 除非您明確告訴python 復制列表的內容, 否則將附加對列表的引用 。 這意味着在說del list1[:]
時也會影響對list2
list1
的引用
這可以通過明確地告訴Python復制列表內容來解決,而不是簡單地將引用復制到同一列表中。
list2.append(list1.copy()) # or list[:]
對於更復雜的結構,應copy.deepcopy()
:
>>> import copy
...
>>> list2.append(copy.deepcopy(list1))
list2.append(list1)
list2只是追加list1參考。 您需要追加list1的副本。
import copy
list2.append(copy.copy(list1))
代替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]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.