4

可能重复:
python中列表的奇怪行为

我正在尝试初始化一个 6 x 6 的无 2D 数组。这是我所做的:

arr = [[None]*6]*6

然后我尝试插入一些值,如下所示:

arr[2][0] = arr[2][1] = 0

它不是将 (2,0) 和 (2,1) 的值更改为 0 并保持数组的其余部分为无,而是将所有列 0 和 1 更改为 0。

完整示例:

>>> arr = [[None]*6]*6
>>> arr
[[None, None, None, None, None, None], [None, None, None, None, None, None], [None, None, None, None, None, None], [None, None, None, None, None, None], [None, None, None, None, None, None], [None, None, None, None, None, None]]

>>> arr[2][0] = arr[2][1] = 0
>>> arr
[[0, 0, None, None, None, None], [0, 0, None, None, None, None], [0, 0, None, None, None, None], [0, 0, None, None, None, None], [0, 0, None, None, None, None], [0, 0, None, None, None, None]]

为什么会发生这种情况,我该如何预防?

ps我使用“奇怪的行为”这个词对我来说很奇怪,而不是python搞砸了:)

4

2 回答 2

4

您正在创建一个包含 6 个对原始 6 元素数组的引用的数组,但您需要有 6 个不同的数组。

尝试

[[None]*6 for i in range(6)]

这将创建 6 个不同的数组。

于 2012-10-21T07:01:11.973 回答
3

当您说 时[None]*6,将创建一个包含六个None值的列表。当你将它乘以 时你得到的就是同一个列表6的六个副本。所以修改一行也会以同样的方式修改所有其他行。

您可以通过执行此操作来解决此问题(或查看此问题以获取替代方案):

arr = [[None]*6 for i in xrange(6)]
于 2012-10-21T07:00:48.713 回答