首页 > 解决方案 > 带有大列表但不是小列表的递归泡菜

问题描述

我在尝试使用pickle递归对象时遇到了一些问题。这是代码(下面的评论):

class A:
    def __init__(self):
        self.xs = []

class B:
    def __init__(self):
        self.xs = []

class X:
    def __init__(self, a, b):
        self.a
        self.b

基本上,X是类AB. 在实践中,A还有B许多其他属性,但这些与这里无关。

如果我运行以下代码:

seq_a = [A() for _ in range(35000)]
seq_b = [B() for _ in range(300)]

for a in seq_a:
    random.shuffle(seq_b)
    for b in seq_b[:10]:
        x = X(a, b)
        a.xs.append(x)
        b.xs.append(x)

然后尝试腌制seq_aseq_b

import io, pickle


class U:
    def __init__(self, seq_a, seq_b):
        self.seq_a = seq_a
        self.seq_b = seq_b

pickle.dump(U(seq_a, seq_b), io.BytesIO())

我收到以下错误:

RecursionError:酸洗对象时超出最大递归深度

仅当我达到 and 的特定大小时才会发生该错误seq_aseq_b例如,使用len(seq_a) == 1000andlen(seq_b) == 100时,代码可以正常工作。

我知道我可以提供__setstate__and __getstate__in U, 但是A,B并且X还有很多其他属性,我想避免在__getstate__.

有没有办法让工作__setstate____getstate__(或其他解决方案)避免制作完整的副本AB并且X不临时修改它们?

标签: pythonpickle

解决方案


推荐阅读