最大递归与sys.getrecursionlimit()所声称的不完全相同。怎么来的?

发布于 2021-01-29 17:29:49

我做了一个小函数,它将实际测量最大递归限制:

def f(x):
    r = x
    try:
        r = f(x+1)
    except Exception as e:
        print(e)
    finally:
        return r

要知道我已经检查了什么:

In [28]: import sys

In [29]: sys.getrecursionlimit()
Out[29]: 1000

然而

In [30]: f(0)
maximum recursion depth exceeded
Out[30]: 970

这个数字不是固定的,总是在970左右,并且在不同的python实例之间会稍有变化(例如,从spyder到system cmd提示符)。

请注意,我在python3上使用ipython。

这是怎么回事? 为什么我要达到的实际限制低于该sys.getrecursionlimit()值?

关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    递归限制不是递归限制,而是python解释器堆栈的最大深度。执行函数之前,堆栈中有一些东西。Spyder会在调用脚本之前执行一些python东西,其他像ipython这样的解释器也会这样做。

    您可以通过inspect模块中的方法检查堆栈。

    在CPython中:

    >>>print(len(inspect.stack()))
    1
    

    在我的Ipython中:

    >>>print(len(inspect.stack()))
    10
    

    正如knbk在注释中指出的那样,只要您达到堆栈限制,就会引发RecursionError,并且解释器会稍微提高堆栈限制,使您可以优雅地处理错误。如果您还用尽了该限制,python将崩溃。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看