[英]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.