如何解决最大递归与sys.getrecursionlimit所声称的不完全相同怎么来的?
递归限制不是递归限制,而是python解释器堆栈的最大深度。执行函数之前,堆栈中有一些东西。Spyder会在调用脚本之前执行一些python东西,其他像ipython这样的解释器也会这样做。
您可以通过inspect
模块中的方法检查堆栈。
在cpython中:
>>>print(len(inspect.stack()))
1
在我的Ipython中:
>>>print(len(inspect.stack()))
10
正如knbk在注释中指出的那样,只要您达到堆栈限制,就会引发RecursionError,并且解释器会稍微提高堆栈限制,使您可以优雅地处理错误。如果您还用尽了该限制,python将崩溃。
解决方法
我做了一个小函数,它将实际测量最大递归限制:
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()
值?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。