我有一个关于 sys.setrecursionlimit()
从python docs这个函数:
设置Python解释器堆栈的最大深度以限制。此限制可防止无限递归导致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。
为什么会这样?
答案 0 :(得分:16)
名字很差。它应该说Stack Depth,而不是Recursion深度。递归意味着它是一遍又一遍的同一个线程,它是限制性的。实际上,你可以拥有100个深度调用的实际代码。我不推荐它,但你可以。他们可以逃脱它,因为在实际的世界中,你遇到这种情况的唯一时间是递归。当你因此崩溃时,看到“Recursion”这个词会让你立即知道要查找的内容而不是“Stack”。
(Stack应该给任何体面的程序员提供相同的线索,但说实话,你的代码只是崩溃了,你想要一个相关的错误信息,对吧?99.99999%的时间这告诉你你搞砸了什么(你错过了你的递归的基本情况。))
答案 1 :(得分:4)
仍然存在Python运行时需要进行的函数调用,甚至可以进入函数。
答案 2 :(得分:4)
它基于TOTAL堆栈深度,而不是任何特定单个函数的深度。当您第一次调用rec()时,您可能已经处于堆栈深度为5。
以5个递归函数为例。每个都进行98次递归调用,最后一次调用是下一个递归函数。如果递归限制为100,您是否真的希望允许每个递归函数进行99次调用,总深度为~500次调用?不,这可能会使翻译人员陷入困境。
因此,递归限制是全局所有函数的最大深度,而不是任何单个命名函数。