Python深浅拷贝(copy vs deepcopy)剖析
请解释Python中copy.copy(浅拷贝)和copy.deepcopy(深拷贝)的区别。它们的工作原理是什么?对于嵌套的可变对象,浅拷贝和深拷贝的行为有何不同?如何自定义对象的拷贝行为(__copy__/__deepcopy__)?使用深拷贝时需要注意哪些性能问题?
回答
小字辈
浅拷贝copy.copy:创建新对象,但填充的是原始对象内部对象的引用。
import copy
a = [[1, 2], [3, 4]]
b = copy.copy(a)
b[0].append(5)
print(a) # [[1, 2, 5], [3, 4]] 内层共享
深拷贝copy.deepcopy:递归复制所有嵌套对象,完全独立。
b = copy.deepcopy(a)
b[0].append(5)
print(a) # [[1, 2], [3, 4]] 完全独立
自定义拷贝:
class MyClass:
def __copy__(self):
return MyClass() # 自定义浅拷贝逻辑
def __deepcopy__(self, memo):
# memo字典跟踪已拷贝对象避免循环
return MyClass()
注意:
- 深拷贝可能很慢(递归复制大量对象)
- 循环引用通过
memo字典处理 - 某些对象(如文件、socket、单例)不可深拷贝,需在
__deepcopy__中特殊处理 copyreg模块可注册自定义拷贝行为
常见用途:
- 浅拷贝:复制顶层结构(如配置快照)
- 深拷贝:副本需要完全隔离(如游戏状态快照)