Python 中的巢狀函數:為什麼不使用閉包?
Python 中的巢狀函數是允許在其他函數中定義函數的函數。這些函數從其封閉範圍繼承變量,從而提供對原本無法存取的變數的存取。
儘管與閉包有相似之處,但 Python 中的巢狀函數並不稱為閉包。這種區別源自於他們的行為。閉包是一個函數,即使在退出作用域之後,它也可以存取封閉作用域中的變數。
當在 Python 中定義巢狀函數時,它本身並不會保留對其封閉作用域的變數的存取權。相反,巢狀函數會建立一個新作用域,並且只能存取該作用域中的變數。
要讓巢狀函數充當閉包,它必須滿足兩個關鍵條件:
如果巢狀函數滿足這兩個條件,它的行為就像一個閉包。否則,它只是一個巢狀函數。
請考慮以下範例:
def make_printer(msg): def printer(): print(msg) return printer printer = make_printer('Foo!') printer() # Output: Foo!
在此範例中,印表機函數從其封閉範圍 (make_printer) 存取 msg 變數。因為它是在其封閉範圍之外執行的(當它被分配給印表機然後調用時),所以它的行為類似於閉包。
相反,不引用其封閉範圍中的變數的巢狀函數不是一個關閉。例如:
def make_printer(msg): def printer(msg=msg): print(msg) return printer printer = make_printer('Foo!') printer() # Output: Foo!
這裡,msg 變數綁定到參數的預設值,而不是封閉範圍內的變數。因此,這個巢狀函數不是閉包。
總之,Python 中的巢狀函數不被稱為閉包,因為它們本質上不表現出閉包的行為,即在退出後從封閉作用域存取變數。要符合閉包的資格,巢狀函數必須引用其封閉範圍中的變數並在其外部執行。
以上是嵌套 Python 函數什麼時候才是真正的閉包?的詳細內容。更多資訊請關注PHP中文網其他相關文章!