[英]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
列表的引用。 作為初學者,這常常令人困惑。 如果你下次改變List
, ListofLists
中的值也會改變,因為它們都引用了同一個列表。 如果你想每次都有一個完全獨立的列表,你應該使用 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.