我真的不知道如何表达这个问题。
假设我执行以下操作:
>>> l = [[]]*2
>>> l
[[], []]
>>> l[0].append(1)
>>> l
[[1], [1]]
为什么1会同时附加到两个列表?
发布于 2011-08-31 18:01:30
[[]]*2
是对相同列表的两个引用的列表。您正在附加它,然后看到它两次。
发布于 2011-08-31 18:02:28
因为实际上只有一个列表。请考虑以下内容:
>>> l = [[]]
>>> l2 = l*2
>>> l2[0] is l[0]
True
>>> l2[1] is l[0]
True
在列表上执行的*2
不会复制列表,但会返回一个长度为2
的列表,其中填充了相同的引用。
你可能想要的是:
>>> l = [[] for _ in xrange(2)]
正如@Asterisk在评论中提到的那样,所有常见的集合都会公开相同的行为。因此,根据经验,最好只在具有值语义的不可变类型上使用乘法。
发布于 2017-04-07 06:11:36
展示内存布局差异的:
listOfLists = [[]] * 3
listOfListsRange = [[] for i in range(0, 3)]
https://stackoverflow.com/questions/7255383
复制相似问题