標籤:

黃哥漫談Python 閉包。

在計算機科學中,閉包(英語:Closure),又稱詞法閉包(Lexical Closure)或函數閉包(function closures),是引用了自由變數的函數。這個被引用的自由變數將和這個函數一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。閉包在運行時可以有多個實例,不同的引用環境和相同的函數組合可以產生不同的實例。

在函數中可以(嵌套)定義另一個函數時,如果內部的函數引用了外部的函數的變數,則可能產生閉包。運行時,一旦外部的 函數被執行,一個閉包就形成了,閉包中包含了內部函數的代碼,以及所需外部函數中的變數的引用。其中所引用的變數稱作上值(upvalue)。

Python 中通俗一點來說,如果在一個函數內部,嵌套了函數,這個內部函數對(非全局作用域)外部作用域的變數進行引用,那麼這個內部函數稱為閉包。閉包每次運行是能記住引用的外部作用域的變數的值。

理解下面這個代碼,函數返回值為函數,Python 函數為第一類對象,可以賦值給變數,可以作為參數傳遞,可以從函數中返回。

被返回的函數為閉包。nonlocal 為Python 3的語法,表示非局部變數。

下面的代碼,是回答這個zhihu.com/question/4873 問題。

# coding:utf-8def foo(): x = 5 def inner(): nonlocal x x += 1 return xreturn innerp = foo()print(p())print(p())print(p())

可以從單步調試來觀看x值的變化。

閉包作用:

可以用來編寫惰性求值的代碼,可以用在函數調用時保持特定狀態。

裝飾器中要用到閉包。

一個對Python初學者難以理解的作用域代碼

zhuanlan.zhihu.com/p/21

216小時學會Python

github.com/pythonpeixun


推薦閱讀:

Python將list連續元素和非連續元素分開轉換為指定字元串
有沒有相對比較成熟的python寫的類似jekyll的靜態頁面生成器,可以利用github pages搭建博客的?
簡歷中如何證明自己的編程能力?
如何用python畫一朵花?

TAG:Python |