4
今天早些時候,我在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'(Python 3.5之前的'RuntimeError')只是一個異常,可能被'try/except/finally'結構捕獲和處理。 2.'finally'塊必須被執行。這兩個語句就是您需要解釋代碼中發生的事情的全部內容。 –
按照@jonrsharpe – OwenHoward