Python 错误 RecursionError: maximum recursion depth exceeded

Python“RecursionError: maximum recursion depth exceeded”错误发生在函数被调用多次以致调用超过递归限制时。 要解决该错误,需要指定退出递归或设置更高递归限制必须满足的基本情况。

Python 错误 RecursionError: maximum recursion depth exceeded

下面是一个产生上述错误的示例。

def example():
    example()


# ⛔️ RecursionError: maximum recursion depth exceeded
example()

我们调用该函数,然后该函数调用自身,直到超出递归限制。

我们可以使用 sys.getrecursionlimit() 方法获取当前递归限制的值。

import sys

# ?️ 1000
print(sys.getrecursionlimit())

# ?️ set recursion limit to 2000
sys.setrecursionlimit(2000)

# ?️ 2000
print(sys.getrecursionlimit())

getrecursionlimit 方法返回 Python 解释器堆栈的最大深度。

如果需要更新此值,可以使用 setrecursionlimit 方法。

为了解决示例中的错误,我们必须指定函数停止调用自身的条件。

counter = 0


def example(num):
    global counter

    if num < 0:
        return # ?️ 这会阻止函数无休止地调用自己

    counter += 1
    example(num - 1)


example(3)

print(counter)  # ?️ 4

这次我们检查每次调用时是否使用小于 0 的数字调用函数。如果数字小于 0,我们只需从函数返回,这样就不会超过 Python 解释器堆栈的最大深度。如果传入的值不小于 0,我们调用传入的值减去 1 的函数,这使我们继续朝着满足 if 检查的情况前进。

递归函数调用自身,直到满足条件。 如果你的函数中没有条件要满足,它将调用自己,直到超过 Python 解释器堆栈的最大深度。

如果我们有一个在某处调用函数的无限循环,则也可能会收到此错误。

def do_math(a, b):
    return a + b


while True:
    result = do_math(10, 10)
    print(result)

我们的 while 循环不断调用该函数,并且由于我们没有退出循环的条件,我们最终超出了解释器堆栈。

这与在没有基本条件的情况下调用自身的函数非常相似。

下面是一个示例,说明如何指定必须满足才能退出循环的条件。

def do_math(a, b):
    return a + b


total = 0
i = 10

while i > 0:
    total += do_math(5, 5)

    i = i - 1

print(total)  # ?️ 100

如果 i 变量等于或小于 0,则 while 循环中的条件不满足,所以我们退出循环。

如果我们无法准确跟踪错误发生的位置,请查看错误消息。

Python 错误 RecursionError: maximum recursion depth exceeded

上图显示错误发生在 example() 函数的第 6 行。

我们还可以看到错误发生在 main.py 文件中。