二维表的赋值语句

Assignment statement for two dimensional list

我的程序需要检查二维数组中的每个元素,并用旧数组的 countNeigh(x,y) 填充新数组 [countNeigh returns 旧数组中存活的邻居数动物阵列]

我将新数组初始化为 current/old 数组的副本,并使用两个 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) 也应该存在问题,因为初始化只是为了复制 current/old 数组

的维度

我会打赌 countNeigh 引用原始 isAnimalArr 进行计算。我对吗?因为,这将解释你的错误答案。为什么?因为这一行:

newAnimalArr = isAnimalArr

您制作了一个参考副本,而不是实际副本。这意味着 newAnimalArrisAnimalArr 引用 相同的 数组。因此,对 newAnimalArr 所做的任何修改都会影响原始文件。例如:

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

x 分配给 y,正如您所做的那样。

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 应该 return 相对于 isAnimalArr 的正确值在任何时候都没有修改。