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

标签 python

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

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

call(1)

最终结果是 979,这对我来说是个奇怪的数字。我找不到任何地方为什么这个数字是标准的。由于我是一名自学成才的程序员,我希望能用简单的术语对其进行解释。

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

最佳答案

这是一个更好的测试:

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 帧,它少了一个堆栈帧。

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

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

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

如果您合理地破坏堆栈并且需要增加限制,可以使用 sys.setrecursionlimit 对其进行修改。

关于python - 为什么python中的最大递归深度是1000?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40115683/

相关文章:

python - boto3 aws api - 列出可用的实例类型

python - 如果用户没有按下任何键,如何自动播放播放列表中的下一首歌曲?

python - cqlengine 连接 set_session() 不处理不同的键空间

python - OJ 说我的 python 程序编译错误,即使它在我的计算机上运行良好(ubuntu 18.04)

python - 如何使用上下文变量在 djangoviews.py 文件中指定页面标题?

python - tzinfo=tzutc() 是否与+00 :00 in python? 相同

java - Java中的字符串乘法

python - 将重复行转换为独立列

python - 使用按键重新启动 While 循环

python - Python中枚举串口(包括虚拟端口)的跨平台方法是什么?