具有相同功能的python中的数组问题

时间:2018-10-17 14:52:32

标签: python arrays

所以我有一个非常奇怪的场景,我简化了代码,但是 相同的问题。

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还是我缺少了什么? 请查看输出的屏幕截图

enter image description here

1 个答案:

答案 0 :(得分:0)

这是因为,当您以自己的方式定义数组时,基本上就是在创建引用的副本,该副本指向[0]*5,这意味着如果您更改一个,它们都会全部更改。您可以在使用numpy时执行所需的操作,这样,当您更改一个索引时,只有该索引会更改。

import numpy as np

destination = np.zeros((3, 5))

您也可以不使用numpy进行操作,如下所示:

destination = [[0] * 5 for _ in range(3)]