在Python中将项目添加到列表列表时出现意外输出
在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], [], [], [], [], [], [], [], [], []]
。
在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)
从输出结果可以看出,在第一个示例中,修改了一个列表的元素后,其他列表也被修改了。而在第二个示例中,每个列表都是独立的,修改一个列表的元素不会影响其他列表。
因此,当我们需要创建包含多个独立列表的列表时,应该使用列表推导式来创建独立的列表,而不是使用*
操作符来复制列表的引用。这样可以避免出现意外的输出结果。