在Python中将项目添加到列表列表时出现意外输出

22 浏览
0 Comments

在Python中将项目添加到列表列表时出现意外输出

这段代码很简单,但它没有达到我想要的效果。有什么问题吗?

代码如下:

In [63]: c = [[]]*10
In [64]: c
Out[64]: [[], [], [], [], [], [], [], [], [], []]
In [65]: c[0]
Out[65]: []
In [66]: c[0] += [1]
In [67]: c
Out[67]: [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]

期望的输出是 [[1], [], [], [], [], [], [], [], [], []]

0
0 Comments

在Python中,当我们使用c = [[]]*10这样的代码创建一个包含10个项目的列表时,会遇到一个经典的陷阱。这个代码实际上创建了一个包含10个项目的列表,但这10个项目其实是同一个确切的列表的引用。因此,修改其中一个项目会影响到其他所有项目。

要创建10个独立的列表,我们可以使用c = [[] for i in range(10)]。这样,我们使用了列表推导式,循环了10次,每次创建一个新的空列表,并将其添加到最终的列表中。

这样做可以确保我们得到10个独立的列表,它们互相之间没有任何关联。这样,我们就可以在其中一个列表中添加元素而不会影响其他列表。

下面是一个示例代码,演示了这个问题的出现原因以及解决方法:

# 创建包含10个项目的列表,但这10个项目是同一个列表的引用
c = [[]]*10
c[0].append(1)
# 输出结果为 [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
print(c)
# 创建10个独立的列表
c = [[] for i in range(10)]
c[0].append(1)
# 输出结果为 [[1], [], [], [], [], [], [], [], [], []]
print(c)

从输出结果可以看出,在第一个示例中,修改了一个列表的元素后,其他列表也被修改了。而在第二个示例中,每个列表都是独立的,修改一个列表的元素不会影响其他列表。

因此,当我们需要创建包含多个独立列表的列表时,应该使用列表推导式来创建独立的列表,而不是使用*操作符来复制列表的引用。这样可以避免出现意外的输出结果。

0