编程Python 开发者

描述 Python 中浅拷贝和深拷贝之间的区别。如何正确复制嵌套数据结构?copy 模块是如何工作的?

用 Hintsage AI 助手通过面试

答案。

在 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())对复杂嵌套对象的不正确复制导致了交易历史的丢失 — 新操作覆盖了旧操作,因为嵌套元素是共享的。