什么是閉包
在維基中,閉包的解釋是這樣的:
在計算機科學中,閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變量的函數(shù)。這個被引用的自由變量將和這個函數(shù)一同存在,即使已經(jīng)離開了創(chuàng)造它的環(huán)境也不例外。所以,有另一種說法認為閉包是由函數(shù)和與其相關的引用環(huán)境組合而成的實體。閉包在運行時可以有多個實例,不同的引用環(huán)境和相同的函數(shù)組合可以產(chǎn)生不同的實例。
我們來看一個簡單的實例:
def outer(arg):
def inner():
print arg * arg
return inner
>>> f = outer(2)
>>> f()
4
內部函數(shù)inner調用外部函數(shù)outer的局部變量arg,它保存了outer的arg值。這就是閉包。
從作用域的角度理解
把上面的例子改一下,在函數(shù)內部輸出局部命名空間:
def outer(arg):
print locals()
def inner():
x = arg * arg
print locals()
print x
return inner
>>> f = outer(2)
{'arg': 2}
>>> f()
{'x': 4, 'arg': 2}
4
>>>
在outer中,局部命名空間只有一個鍵arg,而在inner內部也有arg。上面說的inner保存了outer的arg值,我們就可以理解為inner的局部命名空間保存了arg。
這么一理解,就會發(fā)現(xiàn)閉包其實就這么簡單。
另外再瞎扯一句,python中的裝飾器其實就是閉包。