(Python) RecursionError: 超出最大递归深度

(Python) RecursionError: 超过最大递归深度

(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 # 👈️ this stops the function from endlessly calling itself counter += 1 example(num - 1) example(3) print(counter) # 👉️ 4

这次我们检查函数调用时使用的数字是否小于
0每次调用时的数字。

如果数字小于0,我们只需从函数返回,这样我们就不会超过 Python 解释器堆栈的最大深度。

如果传入的值不小于零,我们用传入的值 minus 调用函数,这使我们朝着
满足检查的
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

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

超出最大递归深度错误消息

上面的截图显示错误发生在84函数的
线上
example()

您还可以看到文件中发生了错误main.py