二维表的赋值语句
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
您制作了一个参考副本,而不是实际副本。这意味着 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
应该 return 相对于 isAnimalArr
的正确值在任何时候都没有修改。
我的程序需要检查二维数组中的每个元素,并用旧数组的 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
您制作了一个参考副本,而不是实际副本。这意味着 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
应该 return 相对于 isAnimalArr
的正确值在任何时候都没有修改。