gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:58:37 28 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/55386559/

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