python pickler - 超出递归深度

时间:2013-04-13 19:52:28

标签: python recursion pickle

我正在尝试挑选我的细胞自动机类的实例,但是我收到了这个错误:

RuntimeError: maximum recursion depth exceeded while calling a Python object

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

  

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

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

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

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

1 个答案:

答案 0 :(得分:6)

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

也有一些不太优雅的解决方案,需要花费更多的时间来挑选一些递归数据,但它很简单(只需几行代码)。链接here

看起来,现在可能是开始慢慢走向python3的时候了。希望有人觉得这个答案很有用。