附加到Python中的2D列表

Dav*_*d M 31 python list

我遇到了我认为Python中的一个奇怪的行为,我希望有人在可能的情况下解释它.

我创建了一个空的2D列表

listy = [[]]*3

print listy

[[], [], []]
Run Code Online (Sandbox Code Playgroud)

以下工作正如我所料:

listy[1] = [1,2] 产量 [[], [1,2], []]

listy[1].append(3) 产量 [[], [1,2,3], []]

但是,当我附加到其中一个空列表时,python会附加到所有子列表,如下所示:

listy[2].append(1)收益率[[1], [1,2,3], [1]].

谁能向我解释为什么会出现这种情况?

Mar*_*ers 57

您尚未创建三个不同的空列表.您已经创建了一个空列表,然后创建了一个新列表,其中包含对同一个空列表的三个引用.要解决此问题,请使用以下代码:

listy = [[] for i in range(3)]
Run Code Online (Sandbox Code Playgroud)

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

>>> 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]]
Run Code Online (Sandbox Code Playgroud)


rec*_*ive 14

[[]]*3是不一样的[[], [], []].

就像你说的那样

a = []
listy = [a, a, a]
Run Code Online (Sandbox Code Playgroud)

换句话说,所有三个列表引用都引用相同的列表实例.