我对sys.setrecursionlimit()有一个疑问
从python docs这个函数:
将Python解释器堆栈的最大深度设置为limit。 此限制可防止无限递归导致C堆栈溢出和Python崩溃。
可能的最高限制取决于平台。 当用户拥有需要深度递归的程序和支持更高限制的平台时,用户可能需要将限制设置为更高。 这应该小心进行,因为过高的限制会导致崩溃。
这是我的问题:
让我们使用这个无用的递归函数:
def rec(N):
if N==0:
return 1
else:
return rec(N-1);
现在,将最大递归设置为100:
sys.setrecursionlimit(100)
如果尝试rec(99)(100次递归调用),则会得到:
RuntimeError: maximum recursion depth exceeded
要计算rec(99),我需要将递归限制设置为105。
为什么会这样呢?
它的名字不好。应该说堆栈深度,而不是递归深度。递归意味着它是限制的一遍又一遍的线程。实际上,您可能拥有只调用了100个深度的实际代码。我不推荐,但您可以。他们可以摆脱它,因为在实际世界中,您遇到这种情况的唯一机会就是递归。因此,当您崩溃时,看到"递归"一词会立即为您提供寻找内容的线索,而不是"堆栈"。
(堆栈应该为任何体面的程序员提供相同的线索,但老实说,您的代码刚刚崩溃了,您想要一条相关的错误消息,对吗?99.99999%的时间告诉您您到底搞砸了(您错过了基本情况)递归。))
谢谢,我想我应该更仔细地阅读定义,而不要看函数的名称
它基于TOTAL堆栈的深度,而不是真正基于任何特定单个函数的深度。第一次调用rec()时,您的堆栈深度可能已经为5。
以5个递归函数为例。每个函数都进行98次递归调用,最后一个调用到下一个递归函数。递归限制为100,您是否真的要允许每个递归函数进行99次调用,总深度约为500次?不,这可能会使解释器在这些深度崩溃。
因此,递归限制是全局所有函数的最大深度,而不是任何单个命名函数的最大深度。
仍然需要Python运行时进行函数调用才能访问您的函数。