Ранее сегодня я прочитал об этом странном случае в Python
, Java
& JS
:Для этого рекурсивного кода почему Python 2.7 не дает ошибку переполнения стека, но 3.5 делает?
try:
return True
finally:
return False
Который возвращает False
.
Итак, я решил игрушку вокруг с ним:
def caseThree():
try:
caseThree()
except:
print("Error")
caseThree()
finally:
return False
print(caseThree())
В Python 2.7
это возвращает:
Error
False
Однако в Python 3.5
:
Error
Fatal Python error: Cannot recover from stack overflow.
Current thread 0x000025ec (most recent call first):
File "`<stdin>`", line 3 in caseThree
последнюю строку повторяется до тех пор, пока вы в конце концов не получите: ...
Может кто-нибудь объяснить, почему код 2.7
не приводит к переполнению стека, а 3.5
делает?
* «Единственное отличие состоит в том, что мы переместили рекурсию из окончательно в try» * - почему вы ожидали, что это * не изменит результат? Непонятно, что вас удивляет или почему. Не могли бы вы сосредоточиться на одной конкретной проблеме? – jonrsharpe
1. 'RecursionError' (' RuntimeError' перед Python 3.5) является просто исключением и может быть пойман и обработан конструкциями 'try/except/finally'. 2. Блок 'finally' должен быть выполнен. Эти два утверждения - все, что вам нужно, чтобы интерпретировать то, что происходит в вашем коде. –
Отредактировал вопрос, чтобы сосредоточиться на одной проблеме, как предложено @jonrsharpe – OwenHoward