在Python中,数据结构dict通常用于存储嵌套信息。在处理模板、配置或在应用程序的不同部分之间传递数据时,开发者经常需要克隆这些结构。
使用赋值(=)进行的标准dict复制仅创建对原始对象的引用。浅复制(shallow copy)复制dict对象本身,但不复制嵌套对象。深复制(deep copy)递归地复制内部的所有对象,这防止了一个副本的更改影响另一个副本。
对于浅复制,可以使用dict.copy()或构造函数dict(),对于深复制则使用copy模块和deepcopy()函数:
import copy d = {"a": 1, "b": {"c": 2}} shallow_d = d.copy() deep_d = copy.deepcopy(d) # 现在修改 shallow_d['b']['c'] 会影响 d['b']['c'] # 修改 deep_d['b']['c'] 不会影响原始字典
关键特点:
dict.copy() 能否复制更深的层级?
不能,dict.copy()只创建浅复制。嵌套字典仍然是指向与原始dict相同对象的引用。
如果结构中有不可变对象(例如元组),deepcopy会深层复制吗?
Deepcopy仅复制可变的嵌套对象。不可变对象保持不变——元组、字符串和数字不会递归复制,只是直接移动到副本中。
可以使用json.loads(json.dumps(dict))进行深复制吗?
可以,但有条件。此方法仅适用于可序列化类型,对于包含非序列化对象的字典(例如函数或自定义类)不适用:
import json orig = {"a": 10, "b": [1,2,3]} copy_like_deep = json.loads(json.dumps(orig)) # 对于复杂对象不起作用
负面案例
开发者通过copy()克隆设置,然后更改嵌套值,认为这是两个独立结构。
优点:
简单且快速
缺点:
一个副本中嵌套对象的更改会反映在所有副本中——难以调试的bug。
积极案例
开发者始终对嵌套结构使用copy.deepcopy(),即使原始dict看起来是平的。
优点:
数据独立性得到保证,bug降到最低
缺点:
Deepcopy速度较慢,消耗更多内存,有时过于冗余。