为什么当我改变副本字典中的元素时,原始字典的元素也会改变?

10 浏览
0 Comments

为什么当我改变副本字典中的元素时,原始字典的元素也会改变?

这个问题已有答案

为什么更新\"浅拷贝\"字典不会更新\"原始\"字典?[重复]

在Python中对字典进行深复制

深拷贝和浅拷贝之间的区别是什么?

浅拷贝、深拷贝和正常赋值操作之间的区别是什么?

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

如果我更改该字典的副本版本,则原始字典的元素将更改。

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

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

为什么会发生这种情况?难道复制操作没有隔离原始和副本版本的字典吗?

我该如何解决这个问题?

我已经谷歌了,似乎没有人在之前提过这个问题。非常感谢您的真诚帮助!

admin 更改状态以发布 2023年5月23日
0
0 Comments

这是对象“浅复制”和“深复制”的区别。

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

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

0
0 Comments

copy()方法是对字典进行浅复制:

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

如果你想进行深度复制,可以使用copy模块中的deepcopy方法:

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

0