簡體   English   中英

附加到 for 循環中的列表列表

[英]Appending to list of lists in for loop

我目前正在遍歷列表的一個值。 在每次迭代中,我將 append 列表轉換為一個新列表,以便獲得一個列表列表。 但是,我收到的輸出並不是我所期望的。

我已經盡可能地簡化了問題並得出了這個結論:

def Function():
     ListOfLists = []
     Lists = [0]
     for j in range(0, 5):
         Lists[0] = Lists[0] + 1
         print(Lists)
         ListOfLists.append(Lists)
     print("ListofLists:")
     print(ListOfLists)

Function()

output 給了我這個:

[1]
[2]
[3]
[4]
[5]
ListofLists:
[[5], [5], [5], [5], [5]]

我本來希望 output 是:

[1]
[2]
[3]
[4]
[5]
ListofLists:
[[1], [2], [3], [4], [5]]

我哪里錯了? 謝謝

您必須為 append 列表的副本。 當您說List時,它是一個參考。 List改變時, ListOfLists改變。 制作副本可防止這種所謂的(非)預期行為。

替換這行代碼:

ListOfLists.append(Lists)

和:

ListOfLists.append(Lists[:])

這是因為所有附加的實例都指向 memory 中的相同地址。

問題:

In [1]: def Function(): 
   ...:      ListOfLists = [] 
   ...:      Lists = [0] 
   ...:      for j in range(0, 5): 
   ...:          Lists[0] = Lists[0] + 1 
   ...:          print(Lists) 
   ...:          ListOfLists.append(Lists) 
   ...:      print("ListofLists:") 
   ...:      print(ListOfLists) 
   ...:  
   ...: Function()                                                                             
[1]
[2]
[3]
[4]
[5]
ListofLists:
[[5], [5], [5], [5], [5]]

解決方案:

檢查 檢查python 中的 list 和 list[:] 有什么區別? .

在這種情況下,使用[:]創建不同的 object(淺拷貝)。 您在 Python 中閱讀了有關深拷貝淺拷貝的內容,以了解更多關於 Python 實際如何處理引用的信息。 有關更多詳細信息,請查看https://www.programiz.com/python-programming/shallow-deep-copy

ListOfLists.append(Lists)替換為ListOfLists.append(Lists[:])

In [2]: def Function(): 
   ...:      ListOfLists = [] 
   ...:      Lists = [0] 
   ...:      for j in range(0, 5): 
   ...:          Lists[0] = Lists[0] + 1 
   ...:          print(Lists) 
   ...:          ListOfLists.append(Lists[:]) 
   ...:      print("ListofLists:") 
   ...:      print(ListOfLists) 
   ...:  
   ...: Function()                                                                             
[1]
[2]
[3]
[4]
[5]
ListofLists:
[[1], [2], [3], [4], [5]]

In [3]:            

嘗試這個:

def Function():
    ListOfLists = []
    for j in range(0, 5):
        ListOfLists.append([j+1])
    print(ListOfLists)
Function() 

當您將 append Lists復制到ListofLists時,它不會單獨復制列表和 append 它。 相反,它只是在ListofLists中附加了對List列表的引用。 作為初學者,這常常令人困惑。 如果你下次改變ListListofLists中的值也會改變,因為它們都引用了同一個列表。 如果你想每次都有一個完全獨立的列表,你應該使用 list 或 `Lists[:]' 上的copy()方法。 或者您可以在附加時動態創建列表,如下所示:

ListofLists = []
for number in range(1,6):
    print([number])
    ListofLists.append([number])
print(ListofLists)

更簡單易讀的方法是使用列表推導,如下所示:

ListofLists = [[number] for number in range(1, 6)]
print(ListofLists)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM