Python閉包的作用域理解

什么是閉包

在維基中,閉包的解釋是這樣的:

在計算機科學中,閉包(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中的裝飾器其實就是閉包。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容