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 循环中的条件不满足,所以我们退出循环。
如果我们无法准确跟踪错误发生的位置,请查看错误消息。
上图显示错误发生在 example() 函数的第 6 行。
我们还可以看到错误发生在 main.py 文件中。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布,任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站。本站所有源码与软件均为原作者提供,仅供学习和研究使用。如您对本站的相关版权有任何异议,或者认为侵犯了您的合法权益,请及时通知我们处理。