我目前正在遍历列表的一个值。在每次迭代中,我都将列表追加到新列表中,以便获得列表列表。但是,我收到的输出不是我期望的。
我已尽可能简化了问题,并得出了以下结论:
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]]
我要去哪里错了? 谢谢
答案 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)