在 Python 中,对对象的复制可以是 浅拷贝 (shallow copy) 和 深拷贝 (deep copy)。浅拷贝创建一个新的容器,但嵌套对象不会被复制,而是使用对同一对象的引用。深拷贝递归地创建所有嵌套对象的新副本,从而确保副本的独立性。
copy 模块提供了 copy()(浅拷贝)和 deepcopy()(深拷贝)方法:
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[1][1] = 42 print(original) # [[99, 2], [3, 4]] - 没有改变
操作符
list2 = list1与使用copy.copy(list1)有什么区别?
回答: 操作符 list2 = list1 创建了对同一对象的新引用。而 copy.copy(list1) 做了浅拷贝,创建了一个新对象列表,但内部对象仍然相同。对于嵌套结构,浅拷贝是不够的 — 需要深拷贝。
故事
在开发 REST API 时,数据通过常规赋值 (
data = template) 进行复制。下一个请求意外地修改了对所有后续用户的 "模板",因为使用了同一个引用。
故事
在报告模块中,数据通过
copy.copy()进行复制,尽管结构是嵌套的(字典中的列表)。在副本中的修改意外地反映在原始数据中,导致统计错误。
故事
在一个银行项目中,通过
copy.copy()(而不是deepcopy())对复杂嵌套对象的不正确复制导致了交易历史的丢失 — 新操作覆盖了旧操作,因为嵌套元素是共享的。