对包含彼此的两个 类 进行深度复制会产生递归错误。 Python

Deepcopy on two classes containing eachother gives recursion error. Python

当我有这样的对象结构时:

from copy import deepcopy

class A:
    def __init__(self, b):
        self.b = b
    def __deepcopy__(self, memodict):
        return A(deepcopy(self.b, memodict))

class B:
    def __init__(self, a):
        self.a = a
    def __deepcopy__(self, memodict):
        return B(deepcopy(self.a, memodict))

test_a = A(None)
test_b = B(None)
test_a.b = test_b
test_b.a = test_a
copy_a = deepcopy(test_a)

然后我尝试对对象进行深层复制,但出现 "maximum recursion depth exceeded" 错误。 我明白为什么会这样,但我不知道解决这个问题的最佳方法是什么?

非常感谢帮助

你不应该覆盖 __deepcopy__,让 deepcopy 函数完成它的工作。 顺便说一句,我不得不删除注释 :B 因为它是一个前向引用并给出了名称错误。

from copy import deepcopy

class A:
    def __init__(self, b):
        self.b = b

class B:
    def __init__(self, a):
        self.a = a


a = A(None)
b = B(None)
a.b = b
b.a = a

aa = deepcopy(a)

print (aa is a) # -> False
print(aa.b is b) # -> False
print(aa.b.a is aa) # -> True

但是,如果您出于任何原因想要覆盖 __deepcopy__,您应该这样做:

from copy import deepcopy


class A:
    def __init__(self, b):
        self.b = b

    def __deepcopy__(self, memodict):
        a = A(None)
        memodict[id(self)] = a
        a.b = deepcopy(self.b, memodict)
        return a


class B:
    def __init__(self, a: A):
        self.a = a

    def __deepcopy__(self, memodict):
        b = B(None)
        memodict[id(self)] = b
        b.a = deepcopy(self.a, memodict)
        return b


a = A(None)
b = B(None)
a.b = b
b.a = a

aa = deepcopy(a)
print(aa is a)  # -> False
print(aa.b is b)  # -> False
print(aa.b.a is aa)  # -> True

参考: