浅拷贝只复制容器本身,创建新对象但内部元素仍是原对象成员的引用;深拷贝递归复制整个对象图,新旧对象完全独立,互不影响。
import copy
a = [[1, 2], [3, 4]]
b = copy.copy(a) # 浅拷贝
c = copy.deepcopy(a) # 深拷贝
a[0].append(99)
b[0] # [1, 2, 99] —— 内层列表共享,受影响
c[0] # [1, 2] —— 完全独立
b.append(5) # 只影响 b,因为外层容器是新对象
要点:
copy.copy、切片[:]、list(a)、dict(a)都是浅拷贝。- 对嵌套结构,浅拷贝的"第一层独立、深层共享"是面试核心考点。
- 不可变元素(int、str、tuple)无所谓深浅,因为无法原地修改。
- 深拷贝用
memo字典记录已复制对象,能处理循环引用;自定义类可通过__copy__/__deepcopy__定制行为。
代价权衡:深拷贝慢且耗内存,大对象图慎用。追问方向:为什么 b = a 不是拷贝(只是引用绑定)、循环引用下 deepcopy 为何不会死循环。