所以我有一个非常奇怪的场景,我简化了代码,但是 相同的问题。
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]*3
dets2=[[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
它正在单次迭代中更改所有数组。
当我使用LONG版本编写时(这不是首选),我得到了正确的版本。
您会看到dest2
是正确的,而destination
是错误的答案。
有趣的是,我只是从短版本中复制了值...结果有所不同...
是Pycharm错误,python还是我缺少了什么? 请查看输出的屏幕截图
答案 0 :(得分:0)
这是因为,当您以自己的方式定义数组时,基本上就是在创建引用的副本,该副本指向[0]*5
,这意味着如果您更改一个,它们都会全部更改。您可以在使用numpy时执行所需的操作,这样,当您更改一个索引时,只有该索引会更改。
import numpy as np
destination = np.zeros((3, 5))
您也可以不使用numpy进行操作,如下所示:
destination = [[0] * 5 for _ in range(3)]