为什么Python在超出实际递归限制之前引发RecursionError?

时间:2019-04-07 14:51:57

标签: python recursion

因此,我尝试使用sys.getrecursionlimit()sys.setrecursionlimit()方法。 默认情况下,递归限制为3000

我尝试使用以下代码对其进行检查:

def recursive(n):
    print(n)
    recursive(n+1)
recursive(0)

它确实将数字打印到2979,它会延迟一秒钟,先打印2980,然后再提高RecursionError

RecursionError: maximum recursion depth exceeded while calling a Python object

我知道当错误超过sys.getrecursionlimit()返回的递归限制时应该引发错误,但不会出现

似乎总是在递归限制之前20次这样做

我也尝试过:

sys.setrecursionlimit(100)
def recursive(n):
    print(n)
    recursive(n+1)
recursive(0)

它仍然做同样的事情,将所有数字打印到79,延迟一秒钟,打印80,然后引发完全相同的错误

为什么它会在错误超过我们通过sys.getrecursionlimit()设置或获得的实际递归限制之前引发错误?

3 个答案:

答案 0 :(得分:3)

调用函数之前,堆栈中已有东西。

在这种情况下,在调用recursive之前,调用堆栈似乎已经有20个调用了。

如果您真的很好奇这20个调用的原因,请参阅here,以了解如何分析堆栈。

答案 1 :(得分:3)

您的recursive()函数不是唯一计入限制的组件。一些Python内部结构也增加了计数器,因为Python代码也可能导致它们被多次调用。 print()函数就是其中之一。

最重要的是,递归限制不仅适用于您编写的Python函数。它适用于整个调用堆栈

答案 2 :(得分:2)

实际上,只要您删除“打印”功能,递归功能“ ALONE”将被精确地调用max = 3000次。这是因为python内置函数也对限制有所贡献。

<Canvas />