【问题标题】:Assignment statement for two dimensional list二维列表的赋值语句
【发布时间】:2018-01-14 06:27:38
【问题描述】:

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

【问题讨论】:

    标签: arrays python-2.7 initialization variable-assignment


    【解决方案1】:

    我将押注countNeigh 引用原始isAnimalArr 进行计算这一事实。我对吗?因为,这将解释你的错误答案。为什么?因为这条线:

    newAnimalArr = isAnimalArr
    

    您制作的是参考副本,而不是实际副本。这意味着 newAnimalArrisAnimalArr 引用 same 数组。因此,对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 相关的正确值,而isAnimalArr 在任何时候都不会被修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 2011-10-24
      • 2012-10-31
      • 2010-11-09
      • 2020-09-09
      • 2017-01-29
      • 2019-07-18
      相关资源
      最近更新 更多