摘要:我們說觸發了閉包的函數叫做閉包函數閉包最大的特點就是它可以被外層函數返回后賦值給一個變量,并且攜帶了外層函數內定義的變量例子如下變量為函數開辟的局部命名空間內定義的變量函數內引用了變量的內層函數名被當作返回值,此時閉包規則達成。
什么是閉包?
其實我們在使用函數過程中不經意間就會觸發閉包,因為總會出于某種原因會在函數內引用或修改上一層函數的變量,這時就會觸發閉包
那么什么是閉包?其實就是函數嵌套時觸發的一種規則,當前函數引用到上一層函數的局部命名空間的變量并且函數本身被當成對象返回時就觸發該規則。
我們說觸發了閉包的函數叫做閉包函數
閉包最大的特點就是它可以被外層函數返回后賦值給一個變量,并且攜帶了外層函數內定義的變量
例子如下:
def func1(): a = 2 #變量a為函數func1()開辟的局部命名空間內定義的變量 def func2(x): return x**a #函數fun2()內引用了變量a print("func2的id:",id(func2)) return func2 #內層函數名被當作返回值,此時閉包規則達成。 res = func1() # 此時res等同于func2,我們可以看看他們的id完全相同 print("res的id: ",id(res)) print(res(3)) del func1 print("刪除函數func1之后:",res(5)) print(res.__closure__) print(type(res.__closure__[0])) print(res.__closure__[0].cell_contents) #此時,如果函數func2()沒有引用外部函數變量a,我們可以試著把return x**a這句改成return x,這時函數func2就沒有觸發閉包規則 #此時如果再次打印res.__closure__,你會發現輸出值為None
從下面輸出結果可以看出,即使刪除了函數func1,理論上應該消失的變量a依然可以使用(理論上a對應的局部空間消失了,則a應消失),變量a之所以仍然可以被引用,是因為閉包規則的作用,外部函數的局部變量可以被內部函數引用,即使外部函數已經返回了。
其實函數本身也是對象,而對象又有很多屬性,其中和閉包相關的就是 closure 屬性。
closure 屬性定義的是一個包含 cell 對象的元組,其中元組中的每一個 cell 對象用來保存作用域中變量的值。
func2的id: 139940709362136 res的id: 139940709362136 9 刪除函數func1之后: 25 #我們來打印一下res的__closure__屬性,可以看出它是由cell對象組成的元組 (,) | #打印類型結果就是元組 2 #打印cell中的值可以看出,這個cell對象中存儲的變量值為2
觸發閉包后,實現了引用上層局部命名空間變量的同時又不依賴于該局部空間,即使該變量所在的函數被刪除了,閉包函數依然可以使用它,實際上閉包函數把它保存在了__closure__屬性中。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42575.html
摘要:在內置命名空間不能使用全局和局部的名字。可以形象地理解成內置命名空間具有最高級別,不需要定義就可以使用,全局命名空間次之,最低級是局部命名空間。 python中的命名空間分三種: 內置的命名空間,在啟動解釋器的時候自動加載進內存的各種名字所在的空間,比如print,input等不需要定義就可以使用的名字 全局命名空間,就是從上到下所有我們定義的變量名和函數名所在的空間,是在程序從上到下...
摘要:定義函數中的函數使用關鍵字定義,格式為函數名形參函數語句塊函數名只能包含字符串下劃線和數字且不能以數字開頭。所以默認參數還是放在后面合適。 定義函數 python中的函數使用關鍵字 def 定義,格式為: def 函數名(形參): 函數語句塊 函數名只能包含字符串、下劃線和數字且不能以數字開頭。函數的形參分為:位置參數、默認參數(自帶默認值的參數)、動態參數return是關鍵字...
摘要:事實上語言當中有的內容,比如函數循環結構體宏等等內容,也都有,所以大家千萬不要認為語言白學了哈因為之前已經完整更新過語言的博客有需要可以往前翻,所以這里直接介紹相對語言當中新增的內容,而本章引入的內容是的關鍵字命名空間缺省參數函數重載。 ...
閱讀 2043·2023-04-25 15:24
閱讀 1583·2019-08-30 12:55
閱讀 1618·2019-08-29 15:27
閱讀 475·2019-08-26 17:04
閱讀 2411·2019-08-26 10:59
閱讀 1806·2019-08-26 10:44
閱讀 2203·2019-08-22 16:15
閱讀 2592·2019-08-22 15:36