コードを次のように変更すると
i = 0
def foo ():
global i
i += 1
print i
try :
foo()
except RuntimeError :
# This call recursively goes off toward infinity, apparently.
foo()
finally:
i -= 1
print i
foo()
出力が 999 を下回ると変動することがわかります (1000 は Python のデフォルトの再帰制限です)。つまり、制限に達すると ( RuntimeError
) の最後の呼び出しfoo()
が終了し、別の呼び出しが開始されてすぐに置き換えられます。
a を上げると、KeyboardInterrupt
トレース全体が一度にどのように終了するかがわかります。
アップデート
興味深いことに、 の 2 番目の呼び出しは-blockfoo()
によって保護されなくなりました。try ... except
したがって、アプリケーションは実際には最終的に終了します。これは、再帰制限をより小さな数に設定すると明らかになります。たとえば、次の出力ですsys.setrecursionlimit(3)
。
$ python test.py
1
2
1
2
1
0
Traceback (most recent call last):
File "test.py", line 19, in <module>
foo()
File "test.py", line 14, in foo
foo()
File "test.py", line 14, in foo
foo()
RuntimeError