繁体   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