L'eccezione è ancora in fase di gettata, ma prima di Python può mostrare si chiedono f2()
nuovo.
Quindi ogni volta che viene sollevata l'eccezione, si introduce un'altra chiamata. Quella chiamata ricorsiva è consentita (perché siamo un gradino al di sotto del limite), superiamo il limite, l'eccezione viene nuovamente sollevata, il gestore finally
si intrufola in un'altra chiamata, quasi ad infinitum.
CTRL-C
non termina il programma per gli stessi motivi; viene sollevata un'eccezione (KeyboardInterrupt
), ma di nuovo il gestore finally:
ti riconduce in ricorsione.
Ora stai cadendo a una velocità tale che sei entrato in orbita attorno all'interprete.
Tutto fa fine, ma i finally
gestori di aggiungere un numero esponenzialmente crescente di chiamate in più prima che la pila può pienamente rilassarsi:
>>> 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
fonte
2014-04-09 19:45:15
credo che questo finirà per essere 'O (n ** n)' nel numero massimo di frame dello stack. così, un po 'di tempo. – Eevee
Stavo proprio venendo a questa realizzazione. Yikes! – mhlester
o forse "O (2 ** n)", in realtà. astronomico in entrambi i casi :) – Eevee