首页 > 解决方案 > 当我更改副本字典时,为什么原始字典的元素会发生变化?

问题描述

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 数组时,

如果我更改这本词典的副本版本,原始词典的元素会发生变化。

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

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

为什么会发生这种情况?复制操作不是将原版和复制版字典隔离开来吗?我怎么解决这个问题?

我有谷歌它,似乎没有人问过它。非常感谢您的真诚帮助!

标签: pythonnumpydictionary

解决方案


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

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

如果你想要一个深拷贝,你可以deepcopycopy模块中使用:

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

推荐阅读