CodeWalk

Python深拷贝与浅拷贝的区别及实现

作者:Yahuda · 2026-05-30 12:55

请解释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.deepcopyfield(default_factory=...)