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