python中奇怪的二维列表行为

时间:2010-12-15 15:22:14

标签: python list

为什么python会执行以下操作?

>>> bla = [[]] * 5
>>> bla[3].append("blub")
>>> print bla
[['blub'], ['blub'], ['blub'], ['blub'], ['blub']]

我希望

[[], [], [], ['blub'], []]

2 个答案:

答案 0 :(得分:5)

这是与Python混淆的常见问题,与隐式传递引用有关。当您键入

x = []

绑定名称x以指向内存中的空列表。当你这样做

x = [[]] * 5

绑定名称x以指向五个事物的列表,每个事物都是对相同空列表的引用。如果您这样想的话,这可能会更清楚:

>>> y = []
>>> x = [y]*5
>>> x
[[], [], [], [], []]
>>> x[0].append(0)
>>> x
[[0], [0], [0], [0], [0]]
>>> y
[0]

即使[]没有绑定任何变量名,它仍会创建对空列表的引用,然后将其复制五次。

如果您不想这样做,则需要明确构建五个空列表以存储在x中。有多种方法可以做到这一点(copy.deepcopy是一般解决方案),但我认为最好的方法是:

x = [[] for _ in range(5)]

或者,numpy是一个扩展模块,它提供了一个非常强大的多维数组。

答案 1 :(得分:3)

您将原始列表的内容乘以五次 - 内部列表只是一个引用,因此相同的引用乘以五次。

换句话说,您获得的最终列表是一个包含多次相同列表的列表。

Python 2的一个简单方法:

[[] for i in xrange(5)]

Python 3:

[[] for i in range(5)]