2014-04-17 33 views
7

我有一些遞歸回溯代碼,測試如果選擇是有效的,然後再做。將is_legal_choice函數嵌套在遞歸函數solve中是不是一個好主意?每次調用solve函數時,都會重新定義這個內部函數嗎?在遞歸函數裏面定義一個內部函數是一個壞主意?

+3

功能*對象*將每個函數被調用時重新創建。這聽起來並不壞,代碼對象已經存在並且功能對象創建相對較輕。 –

+0

如果從維護/可讀性角度對您有意義,請不要過多擔心函數對象創建開銷。 –

+0

@MartijnPieters:我會那麼做......謝謝! – rookie

回答

5

是的,每次調用函數時都會重新定義內部函數。然而,這並不像你想象的那麼糟糕; Python代碼被解析爲一次代碼對象,並且每次只有函數對象(用作代碼對象的一種包裝)被重新構建。

+0

感謝您的回覆。這是有道理的,並且是信息性的! – rookie

1

是的,它每次被調用時都會被重新定義。但是,這並不總是一個壞主意。這就是你如何進行封閉,這有時是有用的。

如果你的is_legal_choice函數需要使用一些僅在外部函數範圍內可用的數據,我會說它去。性能開銷不會太大(如果需要,您可以隨時進行配置)。

如果is_legal_choice不需要任何來自solve的參數的數據,請做任何使您的代碼最容易理解的數據。

你可以找到與谷歌關閉的更多信息,但這裏有一個例子:http://ynniv.com/blog/2007/08/closures-in-python.html