为什么python 1000中的最大递归深度?

时间:2016-10-18 18:39:56

标签: python

我很好奇是什么MRD(最大递归深度)在python中,所以我写了这个:

def call(n):
    print (n)
    return call(n+1)

call(1)

最终结果是979,对我来说这是一个特殊的数字。我找不到为什么这个号码是标准的。因为我是一名自学成才的程序员,所以我会用简单的术语来解释它。

编辑:显然它应该是一个1000,但为什么这个数字呢?

1 个答案:

答案 0 :(得分:4)

这是一个更好的测试:

n = 0

def test_recursion_limit():
    def call():
        global n
        n += 1
        call()
    try:
        call()
    except RuntimeError:
        print(n)

test_recursion_limit()

如果你把它放在spam.py并执行它,它应该为python2和python3返回998。由于初始test_recursion_limit帧,它是一个堆栈帧短。

如果你正在运行一个像ipython这样的REPL,你已经在几帧内,所以你会看到一个较低的数量 - 这不是低于递归限制,而是REPL本身的实现使用了一些堆栈帧。

>>> # freshly opened ipython session
>>> import inspect
>>> len(inspect.stack())
10

您可以通过调用sys.getrecursionlimit()函数来检查当前的递归限制。默认值1000被选为合理的默认值,当您意外执行无限递归调用时,它可以防止系统资源的遮蔽。例如,当使用自定义__getattr__实现时,这很容易做到。

如果您正在合法地吹嘘堆栈并且需要增加限制,可以使用sys.setrecursionlimit进行修改。