為什么要使用閉包
閉包避免了使用全局變量,此外,閉包允許將函數與其所操作的某些數據(環境)關連起來。這一點與面向對象編程是非常類似的,在面對象編程中,對象允許我們將某些數據(對象的屬性)與一個或者多個方法相關聯。
一般來說,當對象中只有一個方法時,這時使用閉包是更好的選擇。來看一個例子:
def adder(x): def wrapper(y): return x + y return wrapper adder5 = adder(5) # 輸出 15 adder5(10) # 輸出 11 adder5(6)
這比用類來實現更優雅,此外裝飾器也是基於閉包的一中應用場景。
所有函數都有一個 __closure__
屬性,如果這個函數是一個閉包的話,那么它返回的是一個由 cell 對象 組成的元組對象。cell 對象的cell_contents 屬性就是閉包中的自由變量。
>>> adder.__closure__ >>> adder5.__closure__ (<cell at 0x103075910: int object at 0x7fd251604518>,) >>> adder5.__closure__[0].cell_contents 5
這解釋了為什么局部變量脫離函數之后,還可以在函數之外被訪問的原因的,因為它存儲在了閉包的 cell_contents中了。