我正在尝试挑选我的细胞自动机类的实例,但是我收到了这个错误:
RuntimeError: maximum recursion depth exceeded while calling a Python object
我的细胞自动机由细胞列表(以及其他一些东西)组成,其中每个细胞都有指向它的邻居的指针。在这个特定的CA中,有256个单元。现在,我知道pickler应该能够识别已经被腌制的物体。
来自docs:
* pickle模块跟踪已经序列化的对象,以便稍后对同一对象的引用不会再次序列化。
所以我真的不知道,为什么我超过了最大递归深度。
我认为也许pickler会进行深度优先酸洗,因此它首先跟随指针,超过递归堆栈然后引发异常。我知道我可以使用sys.setrecursionlimit()
扩展最大递归深度,但我不认为这是一个好的也不是可扩展的解决方案。
第一个问题:pickler深度优先酸洗? 第二个问题:知道如何防止此异常吗?
答案 0 :(得分:6)
所以,正如@ExP所说,pickler做深度优先的酸洗,导致递归超出异常。无论如何,我在这里bugs.python.org找到了解决这个问题的方法。这意味着python 3.1 pickler甚至可以在递归数据上工作,例如图形。
也有一些不太优雅的解决方案,需要花费更多的时间来挑选一些递归数据,但它很简单(只需几行代码)。链接here。
看起来,现在可能是开始慢慢走向python3的时候了。希望有人觉得这个答案很有用。