閉包 學習筆記

2022-01-19 10:16:13 字數 1435 閱讀 6630

學習閉包,邏輯有點混亂,現在記錄一下學習過程。

功能:實現函式容器內儲存乙個變數,記錄該函式執行狀態;

原理:看到一篇blog

總結一下閉包的作用

一般來講,當函式執行完畢之後,函式內部的區域性活動物件就會被銷毀,記憶體中僅儲存全域性作用域,即js的記憶體**機制。

如果這個函式內部又巢狀了另乙個函式,而這個函式是有可能在外部被呼叫到的.並且這個內部函式又使用了外部函式的某些變數的話.這種記憶體**機制就會出現問題。如果在外部函式返回後,又直接呼叫了內部函式,那麼內部函式就無法讀取到他所需要的外部函式中變數的值了.所以js直譯器在遇到函式定義的時候,會自動把函式和他可能使用的變數(包括本地變數和父級和祖先級函式的變數(自由變數))一起儲存起來.也就是構建乙個閉包,這些變數將不會被記憶體**器所**,只有當內部的函式不可能被呼叫以後(例如被刪除了,或者沒有了指標),才會銷毀這個閉包,而沒有任何乙個閉包引用的變數才會被下一次記憶體**啟動時所**。

python應該和js類似,都有垃圾**機制,所以,可以這麼寫:

def wrpper():

n=0def inside():

print(n)

n=n+1

return none

return inside

if __name__ == '__main__':

a=wrpper()

a()a()

a()

結果報錯:unboundlocalerror

在另一篇部落格上找到答案

在python中變數是不需要提取宣告的,乙個變數第一次賦值就是宣告了這個變數。a = a + 1 這個表示式的意思是宣告乙個區域性變數a並將它 + 1後賦值給它自己,而此時a 還沒有初始化(沒有被賦值),所以會出現報錯 unboundlocalerror: local variable 'a' referenced before assignment

雖然閉包中內部函式可以引用外部函式的變數,但a = a + 1 中「=」號前的a覆蓋掉了外部函式f中的區域性變數a=1,所以a = a + 1就會出現未定義的錯誤。只要外部函式f中的區域性變數a 不被覆蓋就可以解決問題。

def wrpper():

n=[0]

def inside():

print(n[0])

n[0] = n[0]+1

return none

return inside

if __name__ == '__main__':

a=wrpper()

a()a()

a()

返回結果:0,1,2符合預期

閉包學習筆記

作用域的定義 變數起作用的範圍 區域性變數的作用域是它自己所在的函式及其巢狀函式 示例1 function getcounter var counter getcounter counter counter counter 釋放閉包與它的環境 counter null counter getcoun...

python學習筆記 閉包

乙個函式a和乙個函式b,其中b函式位於a函式體內部,同時b函式體內呼叫了b函式之外,a函式之內的其他變數x 包括a中傳遞過來的引數 此時,x稱為b函式的環境變數,b函式和變數x就構成了乙個閉包。而函式b是需要返回的,也就是返回函式b,其中在返回的時候,對a引數x的呼叫也包括在了裡面,有點封閉包含的意...

Python學習筆記 閉包

在學習閉包之前,我們先要弄懂一件事兒。同理 test其實就是乙個變數,變數中存放著函式體的位址,就像a變數中存放著100的位址一樣。t test實質上就是淺拷貝行為。將變數test中的位址存放到變數t中 我們如果要呼叫test函式,test 當t獲取了函式體的位址後,同樣可以以t 的形式呼叫函式 注...