沒有區別,因為沒有閉合函式,不是真的。有closures,但這一術語指的是在外部和內部範圍中儲存變數的技術。只剩下巢狀函式。在
巢狀函式只是在另乙個函式內部定義的函式:def outer():
def inner():
當outer()定義了乙個inner()然後也使用的名稱,則該變數名稱為閉包單元,儲存在inner的閉包環境中:
^$這裡variable_in_outer是由inner()在上閉合的,因此建立了乙個閉包。如果inner()的生命週期超過了outer(因為inner被返回給outer()的呼叫者),那麼你不能像處理其他區域性變數那樣只清理variable_in_outer。another_variable是outer中沒有被巢狀函式使用的任何其他變數;它只是另乙個區域性變數,在outer()結束時被清除。在
所以建立了乙個閉包來保持變數的活性,直到inner()也消失了。閉包包含variable_in_outer閉包單元,以及任何其他此類閉包變數,只要{}需要它們。在
在編譯時決定關閉哪些名稱。您可以通過函式物件上的__closure__屬性來內省閉包,閉包單元是閉包單元的元組,每個閉包單元都有乙個cell_contents屬性,允許您訪問變數的當前值。如果沒有閉包,__closure__被設定為none:>>> def outer():
... variable_in_outer = 42
... another_variable = 81
... def inner():
... return variable_in_outer
... return inner # return the inner function object
>>> nested = outer()
>>> nested
.inner at 0x106a46c80>
>>> nested.__closure__
>>> nested.__closure__[0].cell_contents
>>> outer.__closure__ is none # outer has no closed-over variables.
true
因為編譯器決定什麼是閉包,什麼不是閉包,所以您可以反省**物件,以檢視閉包使用了哪些名稱:>>> outer.__code__.co_cellvars
('variable_in_outer',)
>>> outer.__code__.co_consts[3] # code object used to create `inner` functions
", line 3>
>>> outer.__code__.co_consts[3].co_freevars
('variable_in_outer',)
co_cellvars是變為閉包的變數名,co_freevars是使用這些閉包的引用。在
Python巢狀函式 閉包
python中乙個與眾不同的語法就是可以巢狀函式,所謂巢狀,並不像其他語言中的在乙個函式中呼叫另乙個函式,而是在定義乙個函式的時候,函式體裡還能定義另乙個函式。內函式可以訪問外函式的作用域,這就是 python基礎教程 p105裡 它帶著它的環境 和相關的區域性變數 及 由於python的巢狀作用域...
python 閉包 python 閉包
閉包 因為python中函式也可以當作物件,所以如果出現當我們返回乙個函式,而該函式含有外部變數的時候就形成了閉包。閉包的特點 是個巢狀函式 可以獲得非區域性的變數 將函式當作物件返回 看乙個例子會更易理解 def make printer msg msg hi there def printer ...
函式閉包python中的閉包
本文純屬個人見解,是對前面學習的總結,如有描述不正確的地方還請高手指正 單簡說,閉包就是根據不同的置配息信到得不同的結果 再來看看專業的解釋 閉包 closure 是詞法閉包 lexical closure 的簡稱,是引用了由自變數的函式。這個被引用的由自變數將和這個函式一起存在,即使已離開了造創它...