所以我遇到了一个非常奇怪的场景,我简化了代码,但遇到了同样的问题。def write_to_bf_of_lpr(bf_source, bf_destination, lpr_index, start, length): for x in range(length): bf_destination[lpr_index][start + x] = bf_source[start + x]source = ['a','b','c','d','e']destination = [[0]*5]*3dets2=[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]for x in range(1): write_to_bf_of_lpr(bf_source=source,bf_destination=dets2,lpr_index=x,start=1,length=2)for x in range(1): write_to_bf_of_lpr(bf_source=source,bf_destination=destination,lpr_index=x,start=1,length=2)这段代码很容易理解,我希望做的只是每次(或迭代)更改特定的数组。现在:当我在支持版本中编写时:destination = [[0]*5]*3 它正在更改 SINGLE 迭代中的所有数组。当我用 LONG 版本(这不是可取的)编写时,我得到了正确的版本。你可以看到这dest2是正确的,而destination错误的答案。有趣的是,我只是简单地从简短版本中复制了值……结果却有所不同……是 Pycharm 错误、python 还是我遗漏了什么?请看输出截图
1 回答
拉丁的传说
TA贡献1789条经验 获得超8个赞
那是因为当你按照你的方式定义一个数组时,你基本上是在创建引用的副本,[0]*5这意味着如果你改变一个,它们都会改变。您可以在使用 numpy 时做您想做的事情,这样当您更改一个索引时,只有该索引会更改。
import numpy as np
destination = np.zeros((3, 5))
您也可以在没有 numpy 的情况下执行以下操作:
destination = [[0] * 5 for _ in range(3)]
添加回答
举报
0/150
提交
取消