我很好奇是什么MRD(最大递归深度)在python中,所以我写了这个:
def call(n):
print (n)
return call(n+1)
call(1)
最终结果是979,对我来说这是一个特殊的数字。我找不到为什么这个号码是标准的。因为我是一名自学成才的程序员,所以我会用简单的术语来解释它。
编辑:显然它应该是一个1000,但为什么这个数字呢?答案 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
进行修改。