Python深拷贝与浅拷贝的区别及实现
请解释Python中浅拷贝(shallow copy)和深拷贝(deep copy)的区别,并说明copy模块的用法以及自定义对象的拷贝控制。
回答
Yahuda
浅拷贝(shallow copy):
- 创建新对象,但只复制对象本身,不复制对象内部的子对象
- 新对象的子对象引用原对象的子对象
- 方式:
copy.copy(obj)、list.copy()、dict.copy()、切片obj[:]
深拷贝(deep copy):
- 递归复制对象及其所有子对象,创建完全独立的对象
- 方式:
copy.deepcopy(obj)
import copy
original = [[1, 2], [3, 4]]
shallow = copy.copy(original)
deep = copy.deepcopy(original)
shallow[0][0] = 99
print(original) # [[99, 2], [3, 4]] — 原对象被修改!
deep[0][0] = 88
print(original) # [[99, 2], [3, 4]] — 不受影响
自定义拷贝控制:
__copy__():自定义浅拷贝行为__deepcopy__(memo):自定义深拷贝行为__getstate__()/__setstate__():pickle相关,也影响deepcopy
注意事项:
- 深拷贝可能很慢,且对循环引用对象有保护机制(memo字典记录已拷贝对象)
- 不可变对象(int、str、tuple)的拷贝效果与赋值相同
- 包含文件句柄、数据库连接等资源对象时深拷贝可能出错
dataclasses.field(factory=...)创造的默认值在多实例间共享,需用copy.deepcopy或field(default_factory=...)