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.你能解释一下吗?
当堆栈填满时,它会f2在内部调用try,直到达到最大递归深度。
一旦达到该值,它就会引发一个RuntimeError,它由finally
这反过来又引发了相同的RuntimeError,但现在到了较早的堆栈,该堆栈传递给调用finally。
在那里,它再次超过了最大深度。
当 aKeyboardInterrupt被引发时,程序finally仍然继续前进,并且不会退出。
从技术上讲,它不会永远运行,因为只有一个finally. 也就是说,(感谢评论),它允许指数级更多的调用,这非常接近无穷大。递归深度 100 将变为 2 100 == 1267650600228229401496703205376。
如果每次调用花费 1 毫秒,则需要4650 亿年才能完成。这只是 100 的深度
| 归档时间: |
|
| 查看次数: |
1211 次 |
| 最近记录: |