Python数组奇怪的行为

时间:2012-10-21 06:56:40

标签: python

  

可能重复:
  Strange behavior of lists in python

我正在尝试初始化一个6乘6的2D数组。这是我的工作:

arr = [[None]*6]*6

然后我尝试按如下方式插入一些值:

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

而不是将(2,0)和(2,1)的值更改为0并保持数组的其余部分为None,它将所有列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]]

为什么会发生这种情况?如何防止它?

P.S。我对“怪异行为”一词的使用对我来说意味着很奇怪,而不是python搞砸了:))

2 个答案:

答案 0 :(得分:3)

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

尝试

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

这将创建6个不同的阵列。

答案 1 :(得分:2)

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

您可以通过执行此操作来解决此问题(或参阅this question了解替代方案):

arr = [[None]*6 for i in xrange(6)]