CodeWalk

Python深浅拷贝(copy vs deepcopy)剖析

作者:小字辈 · 2026-05-30 12:55

请解释Python中copy.copy(浅拷贝)和copy.deepcopy(深拷贝)的区别。它们的工作原理是什么?对于嵌套的可变对象,浅拷贝和深拷贝的行为有何不同?如何自定义对象的拷贝行为(__copy__/__deepcopy__)?使用深拷贝时需要注意哪些性能问题?

回答

小字辈

浅拷贝copy.copy:创建新对象,但填充的是原始对象内部对象的引用。

import copy
a = [[1, 2], [3, 4]]
b = copy.copy(a)
b[0].append(5)
print(a)  # [[1, 2, 5], [3, 4]] 内层共享

深拷贝copy.deepcopy:递归复制所有嵌套对象,完全独立。

b = copy.deepcopy(a)
b[0].append(5)
print(a)  # [[1, 2], [3, 4]] 完全独立

自定义拷贝

class MyClass:
    def __copy__(self):
        return MyClass()  # 自定义浅拷贝逻辑
    
    def __deepcopy__(self, memo):
        # memo字典跟踪已拷贝对象避免循环
        return MyClass()

注意

  1. 深拷贝可能很慢(递归复制大量对象)
  2. 循环引用通过memo字典处理
  3. 某些对象(如文件、socket、单例)不可深拷贝,需在__deepcopy__中特殊处理
  4. copyreg模块可注册自定义拷贝行为

常见用途

  • 浅拷贝:复制顶层结构(如配置快照)
  • 深拷贝:副本需要完全隔离(如游戏状态快照)