对包含彼此的两个类进行深拷贝会导致递归错误。 Python

问题描述 投票:0回答:1

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

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)

并且我尝试对对象进行深拷贝,但出现“超出最大递归深度”错误。我能理解为什么会这样,但是我不知道解决这个问题的最佳方法是什么?

非常感谢帮助

python python-3.x recursion deep-copy
1个回答
0
投票

您不应该覆盖__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

ref:https://stackoverflow.com/a/15774013/1951448

© www.soinside.com 2019 - 2024. All rights reserved.