在for循环中将元素添加到列表的列表中

3
我目前正在遍历列表中的一个值。在每次迭代时,我将列表添加到一个新列表中,以便拥有一个列表的列表。然而,我收到的输出并不是我期望的。
我已经尽可能简化了问题,并得出了以下结论:
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]]

我本以为输出会是:
[1]
[2]
[3]
[4]
[5]
ListofLists:
[[1], [2], [3], [4], [5]]

我到底哪里出了问题?谢谢。

4个回答

3

你需要添加一个列表的副本。当你说“List”时,它是一个引用。如果“List”改变,“ListOfLists”也会改变。复制可以避免这种所谓的(不)预期的行为。

替换以下代码行:

ListOfLists.append(Lists)

使用:

ListOfLists.append(Lists[:])

为了我自己的理解,这意味着ListOfLists.append(Lists)正在存储对Lists的引用?编辑:hygull在下面回答了这个评论。谢谢! - Hunted

0

这是因为所有附加的实例都指向内存中相同的地址。

问题:

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[:]之间的区别是什么?

在这种情况下,使用[:]来创建一个不同的对象(浅拷贝)。你可以阅读关于 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]:            

0

试试这个:

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

虽然这段代码的输出确实与我的期望相符,但它在我试图编写的更大问题/代码中却无法工作。谢谢! - Hunted

0
当您将Lists附加到ListofLists时,它不会复制列表并将其附加。相反,它只是附加了对ListofLists内部的List列表的引用。这对于初学者来说经常很困惑。如果您下次改变List,则ListofLists中的值也会更改,因为它们都引用同一个列表。如果您想每次都有完全独立的列表,则应在列表上使用copy()方法或`Lists[:]`。或者您可以在附加时即时创建列表,如下所示:
ListofLists = []
for number in range(1,6):
    print([number])
    ListofLists.append([number])
print(ListofLists)

更简单和易读的方法是使用列表推导式,如下所示:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接