我正在尝试初始化一个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搞砸了:))
答案 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)]