詳解python函數(shù)的閉包問題(內(nèi)部函數(shù)與外部函數(shù)詳述)
python函數(shù)的閉包問題(內(nèi)嵌函數(shù))
>>> def func1(): ... print ('func1 running...') ... def func2(): ... print ('func2 running...') ... func2() ... >>> func1() func1 running... func2 running...
內(nèi)部函數(shù)func2作用域都在外部函數(shù)func1作用域之內(nèi)
如果試圖在外部函數(shù)的外部調(diào)用內(nèi)部函數(shù)將會報錯
>>> func2() Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'func2' is not defined
關(guān)于python的閉包問題
如果試圖在一個內(nèi)部函數(shù)里對外部作用域(不包括外部函數(shù)的外部作用域)的變量進行引用,內(nèi)部函數(shù)就會被認為是閉包
>>> def FuncX(x): ... def FuncY(y): ... return x*y ... return FuncY
對于FuncY函數(shù)來說,對在FuncX函數(shù)的整個作用域(FuncY函數(shù)的非全局作用域的外部作用)的變量x進行引用,自此就可以說FuncY函數(shù)就是所謂的閉包
>>> f = FuncX(8) >>> f <function FuncY at 0x7f3a436fc2a8> >>> type(f) <type 'function'> >>> f(10) 80 >>> FuncX(7)(8) 56
由于閉包本身是基于內(nèi)部函數(shù)這一概念而來,所以不能在外部函數(shù)的外部作用域?qū)?nèi)部函數(shù)進行調(diào)用
>>> FuncY(8) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'FuncY' is not defined
既然是基于內(nèi)部函數(shù)這一概念而來,自然對于內(nèi)部函數(shù)來說對引用外部函數(shù)作用域內(nèi)的變量進行修改,將會啟動解釋器的屏蔽機制
>>> def Func1(): ... x = 233 ... def Func2(): ... x *=x ... return x ... return Func2() ... >>> Func1() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 6, in Func1 File "<stdin>", line 4, in Func2 UnboundLocalError: local variable 'x' referenced before assignment
x*=x的左值此時是內(nèi)部函數(shù)作用域里的變量,此時試圖將沒有定義的數(shù)據(jù)進行平方操作,因此報錯
>>> def Func1(): ... x = 233 ... def Func2(): ... x = 321 ... return x ... return Func2() ... >>> Func1() 321
內(nèi)部函數(shù)創(chuàng)建x變量并且屏蔽外部函數(shù)作用域內(nèi)的x變量
python3之前的解決辦法
應(yīng)用容器類型(list,tuple之類的)存放外部函數(shù)作用域的變量從而不會被屏蔽機制屏蔽掉,因為容器類型不是存放在棧里面
>>> def Func1(): ... x = [233] ... def Func2(): ... x[0] *= x[0] ... return x[0] ... return Func2() ... >>> Func1() 54289
python3之后的解決辦法:nonlocal關(guān)鍵字
>>> def Func1(): ... x = 233 ... def Func2(): ... nonlocal x ... x *= x ... return x ... return Func2() ... >>> Func1() 54289
以上所述是小編給大家介紹的python函數(shù)的閉包問題詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Python 200行代碼實現(xiàn)一個滑動驗證碼過程詳解
這篇文章主要介紹了Python 200行代碼實現(xiàn)一個滑動驗證碼過程詳解,各種各樣的驗證碼,比較高級的有滑動、點選等樣式,看起來好像挺復雜的,但實際上它們的核心原理還是還是很清晰的,本文章大致說明下這些驗證碼的原理以及帶大家實現(xiàn)一個滑動驗證碼2019-07-07詳解python內(nèi)置常用高階函數(shù)(列出了5個常用的)
這篇文章主要介紹了python內(nèi)置常用高階函數(shù)(列出了5個常用的),通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02在Python中封裝GObject模塊進行圖形化程序編程的教程
這篇文章主要介紹了在Python中封裝GObject模塊進行圖形化程序編程的教程,本文來自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04Django框架實現(xiàn)分頁顯示內(nèi)容的方法詳解
這篇文章主要介紹了Django框架實現(xiàn)分頁顯示內(nèi)容的方法,結(jié)合實例形式詳細分析了Django框架引入bootstrap樣式進行分頁顯示相關(guān)步驟、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下2019-05-05Python使用win32com實現(xiàn)的模擬瀏覽器功能示例
這篇文章主要介紹了Python使用win32com實現(xiàn)的模擬瀏覽器功能,結(jié)合實例形式分析了Python基于win32com模塊實現(xiàn)網(wǎng)頁的打開、登陸、加載等功能相關(guān)技巧,需要的朋友可以參考下2017-07-07