猿问

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

所以我遇到了一个非常奇怪的场景,我简化了代码,但遇到了同样的问题。


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 它正在更改 SINGLE 迭代中的所有数组。


当我用 LONG 版本(这不是可取的)编写时,我得到了正确的版本。


你可以看到这dest2是正确的,而destination错误的答案。


有趣的是,我只是简单地从简短版本中复制了值……结果却有所不同……


是 Pycharm 错误、python 还是我遗漏了什么?请看输出截图

Helenr
浏览 192回答 1
1回答

拉丁的传说

那是因为当你按照你的方式定义一个数组时,你基本上是在创建引用的副本,[0]*5这意味着如果你改变一个,它们都会改变。您可以在使用 numpy 时做您想做的事情,这样当您更改一个索引时,只有该索引会更改。import numpy as npdestination = np.zeros((3, 5))您也可以在没有 numpy 的情况下执行以下操作:destination = [[0] * 5 for _ in range(3)]
随时随地看视频慕课网APP

相关分类

Python
我要回答