最大递归并不完全是 sys.getrecursionlimit() 所声称的。怎么会?

2024-04-30

我制作了一个小函数,可以实际测量最大递归限制:

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

However

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

这个数字并不固定,总是在~970左右,并且在不同的Python实例之间略有变化(例如从spyder内部到系统cmd提示符)。

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

这是怎么回事?为什么我的实际限制低于sys.getrecursionlimit() value?


递归限制不是递归的限制,而是Python解释器堆栈的最大深度。在函数执行之前,堆栈上有一些东西。 Spyder 在调用脚本之前会执行一些 Python 内容,其他解释器(如 ipython)也是如此。

您可以通过以下方法检查堆栈inspect module.

对我来说,在 CPython 中:

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

在我的 Ipython 中:

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

正如 knbk 在注释中指出的那样,一旦达到堆栈限制,就会抛出 RecursionError ,并且解释器会稍微提高堆栈限制,以便您可以优雅地处理错误。如果你也耗尽了这个限制,python就会崩溃。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最大递归并不完全是 sys.getrecursionlimit() 所声称的。怎么会? 的相关文章

随机推荐