這是一些行為特殊的代碼。這是我編寫的行為的簡化版本。這仍然會顯示出怪異的行為,我對為什么會發生這種現象有一些特定的疑問。我在Windows 7上使用Python 2.6.6。def demo1(): try: raise RuntimeError,"To Force Issue" except: return 1 else: return 2 finally: return 3def demo2(): try: try: raise RuntimeError,"To Force Issue" except: return 1 else: return 2 finally: return 3 except: print 4 else: print 5 finally: print 6結果:>>> print demo1()3>>> print demo2()63為什么演示1返回3而不是1?為什么演示2打印6而不是打印6 w / 4或5?
3 回答

阿波羅的戰車
TA貢獻1862條經驗 獲得超6個贊
因為保證可以執行finally語句(因此,假定沒有斷電或Python無法控制的任何事情)。這意味著在函數可以返回之前,它必須運行finally塊,該塊返回一個不同的值。
在Python文檔狀態:
當在try ... finally語句的try套件中執行return,break或Continue語句時,finally子句也會在“出路”上執行。在finally子句中,continue語句是非法的。(原因是當前實施存在問題-將來可能會取消此限制)。
這意味著,當您嘗試返回時,將finally調用該塊,并返回其值,而不是原來的值。

呼啦一陣風
TA貢獻1802條經驗 獲得超6個贊
執行順序為:
嘗試阻止所有正常完成->最終阻止->函數結束
嘗試運行塊并進入異常A->最終阻塞->函數結束
嘗試塊返回值并調用返回->最終阻止->彈出返回值->函數結束
因此,finally塊中的任何返回都將提前結束步驟。
添加回答
舉報
0/150
提交
取消