6

我正在尝试腌制我的元胞自动机类的实例,但出现此错误:

RuntimeError: maximum recursion depth exceeded while calling a Python object

我的元胞自动机由细胞列表(和一堆其他东西)组成,其中每个细胞都有指向它的邻居的指针。在这个特定的 CA 中,有 256 个单元。现在,我知道pickler 应该能够识别已经腌制的对象。

来自文档:
*pickle 模块跟踪它已经序列化的对象,以便以后对同一对象的引用不会再次被序列化。

所以我真的不知道,为什么我超过了最大递归深度。

我认为也许pickler会进行深度优先酸洗,以便它首先跟随指针,超过递归堆栈然后引发异常。我知道我可以用 扩展最大递归深度sys.setrecursionlimit(),但我不认为这是好的或可扩展的解决方案。

第一个问题:酸洗深度优先酸洗吗?
第二个问题:知道如何防止这种异常吗?

4

1 回答 1

6

因此,正如@ExP 所说,pickler 会进行深度优先酸洗,这会导致递归超出异常。无论如何,我在这里bugs.python.org找到了解决这个问题的方法。这意味着对于 python 3.1,pickler 甚至可以处理递归数据,例如图形。

还有一些不太优雅的解决方案需要更多时间来腌制一些递归数据,但它很简单(只需几行代码)。链接在这里

看起来,可能是时候开始慢慢向 python3 移动了。希望有人觉得这个答案有用。

于 2013-04-16T18:07:19.590 回答