Python中的二维列表追加操作

44

我在Python中遇到了一种我认为是奇怪的行为,如果可能的话,我希望有人能够解释一下。

我创建了一个空的二维列表。

listy = [[]]*3

print listy

[[], [], []]

以下代码表现出了我所期望的效果:

listy[1] = [1,2] 会得到 [[], [1,2], []]

listy[1].append(3) 会得到 [[], [1,2,3], []]

然而,当我向其中一个空列表添加元素时,Python会将元素添加到所有子列表中,具体如下:

listy[2].append(1) 会得到 [[1], [1,2,3], [1]]

是否有人能够解释一下为什么会出现这种行为呢?


4
我想知道每个月有多少次会被问到这个问题。毫无疑问,这是关于Python的历史最常见的问题之一(不仅限于Stack Overflow)。在Python官方文档的FAQ中有提到:如何创建一个多维列表? - John Y
3个回答

71

你没有创建三个不同的空列表,而是创建了一个空列表,然后创建了一个新列表,在该新列表中有三个对同一个空列表的引用。要解决这个问题,请改用以下代码:

listy = [[] for i in range(3)]

运行您的示例代码现在会得到您可能期望的结果:

>>> listy = [[] for i in range(3)]
>>> listy[1] = [1,2]
>>> listy
[[], [1, 2], []]
>>> listy[1].append(3)
>>> listy
[[], [1, 2, 3], []]
>>> listy[2].append(1)
>>> listy
[[], [1, 2, 3], [1]]

这非常有道理。谢谢。 - David M
这是我在Python中遇到的最奇怪的功能,几乎像个bug。 - Quantum Guy 123

19

[[]]*3 不等同于 [[], [], []]

这就好像你说

a = []
listy = [a, a, a]

换句话说,这三个列表引用都指向同一个列表实例。


-3
来这里看如何将项目附加到2D数组,但是线程的标题有点误导,因为它正在探讨附加的问题。
我发现将项目附加到2D列表的最简单方法是这样的: list=[[]]

list.append((var_1,var_2))

这将导致一个带有2个变量var_1,var_2的条目。希望这可以帮到你!


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