Python递归RuntimeError

Pio*_*ski 8 python recursion

def f1():
    f1()
Run Code Online (Sandbox Code Playgroud)

我们都知道在Python中调用这个函数会产生 RuntimeError: maximum recursion depth exceeded

我写了它的sligtly修改版本:

def f2():
    try:
        f2()  #This line throws an error
    finally: #except works too
        f2()  #This line does not throw an error!
Run Code Online (Sandbox Code Playgroud)

第二个函数永远运行而不抛出RuntimeError.更重要的是,我无法通过CtrlC组合阻止它.

我不明白为什么调用f2()不会抛出RuntimeError.你能解释一下吗?

mhl*_*ter 4

当堆栈填满时,它会f2在内部调用try,直到达到最大递归深度。

一旦达到该值,它就会引发一个RuntimeError,它由finally

这反过来又引发了相同的RuntimeError,但现在到了较早的堆栈,该堆栈传递给调用finally

在那里,它再次超过了最大深度。

当 aKeyboardInterrupt被引发时,程序finally仍然继续前进,并且不会退出。

从技术上讲,它不会永远运行,因为只有一个finally. 也就是说,(感谢评论),它允许指数级更多的调用,这非常接近无穷大。递归深度 100 将变为 2 100 == 1267650600228229401496703205376。

如果每次调用花费 1 毫秒,则需要4650 亿年才能完成。这只是 100 的深度