二维列表的赋值语句

时间:2017-08-07 02:27:11

标签: arrays python-2.7 initialization variable-assignment

我的程序需要检查二维数组中的每个元素,并使用旧数组的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)也应该存在问题,因为初始化只是为了复制当前/旧数组的维度

1 个答案:

答案 0 :(得分:0)

我会对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应该返回与isAnimalArr相关的正确值,而 * https://stackoverflow.com/questions/1358595/how-to-map-collections-in-dozer * http://www.baeldung.com/dozer * https://mvnrepository.com/artifact/net.sf.dozer/dozer/5.5.1 * https://www.youtube.com/watch?v=m68Cq_AnEJU * https://github.com/jiyeonseo/springboot-dozer-sample 在任何时候都不会被修改时间。