CodeWalk

Python自定义__copy__和__deepcopy__完整实现

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

如何为一个自定义类实现__copy____deepcopy__方法以控制拷贝行为?说明memo字典在深拷贝中的作用(如何避免循环引用重复拷贝)。给出一个包含文件句柄(不可拷贝)、缓存字典(浅拷贝共享)、内部列表(深拷贝独立)的混合拷贝示例。

回答

小字辈

import copy

class DataProcessor:
    def __init__(self, data):
        self.data = data  # list,需要深拷贝
        self.cache = {}   # 缓存,浅拷贝共享
        self.file = None  # 文件句柄,不可拷贝
    
    def __copy__(self):
        # 浅拷贝:创建新对象,内部引用共享
        new = DataProcessor.__new__(DataProcessor)
        new.data = self.data  # 引用共享
        new.cache = self.cache  # 引用共享
        new.file = self.file  # 引用共享
        # 或者更简单地:
        # return copy.copy(super())
        return new
    
    def __deepcopy__(self, memo):
        # memo: 已拷贝对象的映射,避免循环引用
        new = DataProcessor.__new__(DataProcessor)
        memo[id(self)] = new  # 注册避免重复
        new.data = copy.deepcopy(self.data, memo)
        new.cache = copy.copy(self.cache)  # 浅拷贝缓存
        new.file = self.file  # 文件句柄直接引用(不可深拷贝)
        return new

# 循环引用场景
proc = DataProcessor([1, 2, 3])
proc.ref = proc  # 自引用
proc2 = copy.deepcopy(proc)  # memo确保proc2.ref指向proc2而非新对象

memo字典的关键作用

  1. 映射:id(original) → copy
  2. 当深拷贝遇到已拷贝的对象时,直接返回已创建的副本
  3. 防止循环引用导致无限递归
  4. 保证同一对象的多个引用指向同一个副本