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 数组时,
如果我更改这本词典的副本版本,原始词典的元素会发生变化。
这可能会导致一些潜在的和潜在的错误,
实际上我不希望这种情况发生。
为什么会发生这种情况?复制操作不是将原版和复制版字典隔离开来吗?我怎么解决这个问题?
我有谷歌它,似乎没有人问过它。非常感谢您的真诚帮助!
解决方案
dict的copy()
方法是浅拷贝:
dct1 = {'a': [1, 2, 3]}
dct2 = dct1.copy()
dct1['a'] is dct2['a']
# True
如果你想要一个深拷贝,你可以deepcopy
从copy
模块中使用:
from copy import deepcopy
dct2 = deepcopy(dct1)
dct1['a'] is dct2['a']
# False
推荐阅读
- angular - 不发送放置请求角度
- php - IF...ElseIf...Else 语句中的 PHP 运算符。跳到其他地方?
- dart - TabView 中的数据在切换标签后重置 Flutter
- javascript - 修改插件以对添加的表单字段使用动态命名
- c++ - 是否可以禁用 bool operator<(float,int)
- python - 在python中将2个文本文件汇总为一个文件
- docker - 澄清 Docker Compose 的 `start_period` 参数
- javascript - 来自 webview 节点中的 javascript Selenium chrome webdriver 的警告/错误消息
- mongodb - 如何在从文件中读取并使用 shellscript 将内容传递给另一个执行器时转义双引号?
- spring - 如何使用 logback 禁用 Spring 异步日志记录