2017-08-07 22 views
0

我的程序需要检查二维数组中的每个元素,并使用旧数组的countNeigh(x,y)填充一个新数组[countNeigh返回旧数组中的活着的邻居动物阵列]二维列表的分配声明

我初始化新阵列作为电流/旧数组的副本,并使用两个for循环来检查每个单独的元件,以及填充该新的数组:

newAnimalArr = isAnimalArr 
for x in range(len(isAnimalArr)): 
    for y in range(len(isAnimalArr[x])): 
     newAnimalArr[x][y] = countNeigh(x,y) 

上述代码填充newAnimalArr值不正确。我98%确定这不是countNeigh(x,y)函数中的错误,因为稍微改变代码(如下所示)时,newAnimalArr具有正确的值。

newAnimalArr = [] 

for x in range(len(isAnimalArr)): 
    rowArr = [] 
    for y in range(len(isAnimalArr[x])): 
     rowArr.append(countNeigh(x,y)) 
    newAnimalArr.append(rowArr) 

-第一部分代码的问题是什么?数组的初始化?或每个元素的赋值语句?

我之前已经读过,初始化一个二维数组q = [[None]*5]*4是一个被多次引用的数组(这会导致通过单个数组的所有重复来分配单个元素);即使类似的问题发生在我的数组中,那么也应该存在与赋值语句newAnimalArr[x][y] = countNeigh(x,y)有关的问题,因为初始化只是为了复制当前/旧数组的维度而已。

回答

0

我会对此事进行对冲countNeigh参考原始isAnimalArr进行计算。我对吗?因为,那会解释你错误的答案。为什么?因为该行的:

newAnimalArr = isAnimalArr 

你让一个参考副本,不是实际拷贝。这意味着newAnimalArrisAnimalArr是指相同的阵列。因此,对newAnimalArr所做的任何修改都会影响原始内容。例如:

In [1028]: x = [[1, 2, 3], [4, 5, 6]] 

分配xy,因为你做了。

In [1029]: y = x 

比较ids,它们是一样的。

In [1032]: id(x) == id(y) 
Out[1032]: True 

修改y

In [1033]: y[0][1] = 234567 

的变化是x见过太多。

In [1034]: x 
Out[1034]: [[1, 234567, 3], [4, 5, 6]] 

如果你想避免这种情况,你需要做一个副本。

import copy 
newAnimalArr = copy.copy(isAnimalArr) 

现在,newAnimalArr所做的更改对isAnimalArr没有影响,所以应countNeigh相对于isAnimalArr未在任何时间点修改返回正确的价值观。