浅拷贝只复制容器本身,创建新对象但内部元素仍是原对象成员的引用;深拷贝递归复制整个对象图,新旧对象完全独立,互不影响。

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 为何不会死循环。