我的程序需要检查二维数组中的每个元素,并使用旧数组的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 :(得分:0)
我会对countNeigh
引用原始isAnimalArr
进行计算的事实进行对冲。我对吗?因为,这将解释你的错误答案。为什么?因为这一行:
newAnimalArr = isAnimalArr
您制作参考副本,而不是实际副本。这意味着newAnimalArr
和isAnimalArr
引用了相同的数组。因此,对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
在任何时候都不会被修改时间。