python中奇怪的二维列表行为
python为什么要做以下事情python中奇怪的二维列表行为,python,list,Python,List,python为什么要做以下事情 >>> bla = [[]] * 5 >>> bla[3].append("blub") >>> print bla [['blub'], ['blub'], ['blub'], ['blub'], ['blub']] 我希望 [[], [], [], ['blub'], []] 您将原始列表的内容乘以五倍-内部列表只是一个引用,因此相同的引用被乘以五倍 换句话说,您得到的最终列表是一个多次包含同一列表的列
>>> bla = [[]] * 5
>>> bla[3].append("blub")
>>> print bla
[['blub'], ['blub'], ['blub'], ['blub'], ['blub']]
我希望
[[], [], [], ['blub'], []]
您将原始列表的内容乘以五倍-内部列表只是一个引用,因此相同的引用被乘以五倍 换句话说,您得到的最终列表是一个多次包含同一列表的列表 对于Python 2,解决此问题的简单方法是:
[[] for i in xrange(5)]
Python 3:
[[] for i in range(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
是一个扩展模块,它提供了一个非常强大的多维数组。\u
(overi
)是推荐的,因为它表示“我实际上没有使用它”(而i
通常用作索引)。