当我更改副本字典之一时,为什么原始字典的元素会更改?

时间:2021-01-11 13:58:40

标签: python numpy dictionary

import numpy as np  

var_np = np.zeros(shape=[2])

dic_orig = {'var_np':var_np.copy(), 'var_int':0}

dic_copy = dic_orig.copy()

dic_copy['var_np'] += 1
dic_copy['var_int'] += 1

#problem
print(dic_orig['var_int']) #ouput: 0  -->Didn't chagne, Good! 
print(dic_orig['var_np']) #ouput:[1,1] -->This change, Bad!

#The output shows that this two have different id
#The how would the problem happen?
print(id(dic_orig['var_int'])) #ouput:1474134096
print(id(dic_copy['var_int'])) #ouput:1474134128

如代码演示所示,

当字典的元素是一个numpy数组时,

如果我修改了这本词典的副本,原词典的元素就会改变。

这可能会导致一些潜在和潜在的错误,

实际上我不希望这种情况发生。

为什么会这样?复制操作不是将原始字典和复制版本字典隔离了吗? 我该如何解决这个问题?

我用谷歌搜索过,好像以前没人问过。非常感谢您真诚的帮助!

2 个答案:

答案 0 :(得分:1)

dict 的 copy() 方法是浅拷贝:

dct1 = {'a': [1, 2, 3]}
dct2 = dct1.copy()
dct1['a'] is dct2['a']
# True

如果您想要深层复制,可以使用 copy module 中的 deepcopy

from copy import deepcopy
dct2 = deepcopy(dct1)
dct1['a'] is dct2['a']
# False

答案 1 :(得分:0)

这是“浅”拷贝和“深拷贝”的区别。

在浅拷贝中,对象字段被复制作为引用。如果您更改一个,另一个也会更改,因为引用指向相同的内存地址。在深层复制中,对象的实际新副本会在全新的地址中创建。

您应该使用 .copy() 而不是使用 copy.deepcopy()