追加到for循环中的列表清单

时间:2019-10-27 04:16:02

标签: python list for-loop

我目前正在遍历列表的一个值。在每次迭代中,我都将列表追加到新列表中,以便获得列表列表。但是,我收到的输出不是我期望的。

我已尽可能简化了问题,并得出了以下结论:

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 个答案:

答案 0 :(得分:1)

您必须附加一个列表副本。当您说List时,它是参考。 List更改时,ListOfLists更改。进行复制可以防止这种所谓的(意外)行为。

替换此行代码:

ListOfLists.append(Lists)

具有:

ListOfLists.append(Lists[:])

答案 1 :(得分: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]]

解决方案:

选中Check What is the difference between list and list[:] in python?

  

在这种情况下,使用[:]创建另一个对象(浅表副本)。您了解了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]:            

答案 2 :(得分:0)

尝试一下:

x_i

答案 3 :(得分:0)

Lists附加到ListofLists时,它不会单独复制列表并将其附加。相反,它只是在List内的ListofLists列表后面附加了引用。作为初学者,这通常令人困惑。如果您下次更改List,则ListofLists中的值也会更改,因为它们两个都引用相同的列表。如果您希望每次都有一个完全独立的列表,则应在列表或“ 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)