(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
。