例外仍然被拋出,但前Python可以顯示它您呼叫f2()
再次。
因此,每次引發異常時,都會潛入另一個電話。允許遞歸調用(因爲我們比限制低了一步),我們超過了限制,異常再次發生,finally
處理程序在另一個調用中潛入,幾乎是無限的。
CTRL-C
由於相同的原因不會結束程序;會引發異常(KeyboardInterrupt
),但finally:
處理程序再次將您發送回遞歸。
你現在正以這樣一個速度落在繞解釋者的軌道上。
這一切都確實結束,但finally
處理程序添加一個指數增長一些額外的調用堆棧之前可以充分放鬆:內try
>>> import sys
>>> def f2(depth=0, final=0):
... try:
... print depth
... f2(depth + 1, final)
... finally:
... print 'finally:', final
... f2(depth, final + 1)
...
>>> sys.setrecursionlimit(5)
>>> f2()
0
1
2
3
finally: 0
finally: 0
2
finally: 1
finally: 0
1
2
finally: 1
finally: 1
1
finally: 2
finally: 0
0
1
2
finally: 1
finally: 1
1
finally: 2
finally: 1
0
1
finally: 2
finally: 2
0
finally: 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in f2
File "<stdin>", line 7, in f2
File "<stdin>", line 7, in f2
File "<stdin>", line 7, in f2
RuntimeError: maximum recursion depth exceeded
我相信這最終會成爲實際上最大堆棧幀數中的'O(n ** n)'。所以,相當長一段時間。 – Eevee
我只是自己來實現這個目標。哎呀! – mhlester
或者實際上可能是'O(2 ** n)'。天文數字:) – Eevee