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数组时,
如果我修改了这本词典的副本,原词典的元素就会改变。
这可能会导致一些潜在和潜在的错误,
实际上我不希望这种情况发生。
为什么会这样?复制操作不是将原始字典和复制版本字典隔离了吗? 我该如何解决这个问题?
我用谷歌搜索过,好像以前没人问过。非常感谢您真诚的帮助!
答案 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()
。