Если изменить код
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()
завершается, а другой - для его немедленного его замены.
Если вы поднимите KeyboardInterrupt
, вы увидите, как прекращается вся трасса.
UPDATE
Интересно, что второй вызов foo()
не защищен try ... except
-блоком больше. Поэтому приложение в конечном итоге прекратится. Это станет apparant, если вы установите ограничение рекурсии на меньшее число, например. выход для 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
Ну, вы просто держать на вызов 'Foo', без условия остановки, поэтому он будет продолжать рекурсию навсегда. И даже когда вы получаете исключение, вы рекурсируете _again_. –
Должно быть, у Python не хватает памяти или что-то в этом роде? Или стек вызовов очищается после 'RuntimeError'? – rectangletangle
Возможно, python оптимизирует его в итерации – Blorgbeard