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

问题描述 投票:2回答:3

所以我试图用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()获得的实际递归限制之前引发错误?

python recursion
3个回答
3
投票

在调用函数之前,堆栈上有东西。

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

如果您真的很好奇这20个电话的组成,请参阅here了解如何分析堆栈。


3
投票

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

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


2
投票

实际上,只要删除“print”函数,递归函数“ALONE”就会被调用max = 3000次。这是因为python内置函数也有助于限制。

import sys
count = 0
def recursive(n):
    global count
    count = count + 1
    recursive(n+1)


sys.setrecursionlimit(3000)
try:
    recursive(0)
except:
    print count  # would print 2999
© www.soinside.com 2019 - 2024. All rights reserved.