如何在Python中将项附加到列表中的列表?

3

好的,请先查看以下代码:

Demo1 = [[], []]
Demo2 = [[]] * 2
Demo1[0].append(1)
Demo2[0].append(1)
print "Demo1: ", Demo1
print "Demo2: ", Demo2

以下是输出结果:

Demo1:  [[1], []]
Demo2:  [[1], [1]]

我需要创建一个列表,其中的项目也都是列表,就像 Demo1Demo2 一样。当然,我在我的脚本中使用了 Demo2 ,但它一直出现问题,直到我找到了上面代码所示的原因。那么为什么会发生这种情况呢?在大多数情况下,我会使用 Demo2 来创建这样的列表,因为它的长度每次都不同,但如何将项目附加到列表中的分离列表中而不会造成混乱呢?

我重复打印了几次"Demo2: "和Demo2,发现在线上第一行不起作用,但后续的行都可以工作,很奇怪吧。 - drhanlau
应该在下一期的周报中 :) - Kirill
2个回答

4

对于你的第一个问题:这是因为在Demo2的情况下,你的列表包含了两个相同对象的副本。例如下面的代码,我打印出那些元素的内存地址,注意在Demo1中它们不同,但在Demo2中它们相同。

>>> Demo1 = [[], []]
>>> Demo2 = [[]] * 2
>>> print id(Demo1[0]), id(Demo1[1])
33980568 34018800
>>> print id(Demo2[0]), id(Demo2[1])
34169920 34169920

对于你的第二个问题:你可以使用列表推导式,如[[] for i in xrange(n)],以便创建一个新的列表n次,而不是重复相同的列表n次。

示例:

>>> Demo2 = [[] for i in xrange(2)]
>>> Demo2
[[], []]
>>> Demo2[0].append(1)
>>> Demo2
[[1], []]

谢谢,问题解决了。虽然我仍然不明白为什么要这样设计。对我来说,使用 Demo2 = [[]] * 2 创建重复的东西是没有意义的。 - Shane

2

Demo2 是一个包含两个对同一列表的引用的列表。

Demo2 = [[] for x in range(2)]

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