我制作了一个小函数,可以实际测量最大递归限制:
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(使用前将#替换为@)