gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:14:41 25 4
gpt4 key购买 nike

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

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 到系统 cmd 提示符)。

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

发生了什么事? 为什么我的实际限制低于 sys.getrecursionlimit() 值?

最佳答案

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

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

在 CPython 中对我来说:

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

在 Ipython 中对我来说:

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

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

关于python - 最大递归并不完全是 sys.getrecursionlimit() 声称的。怎么来的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38265839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com