詳解python函數(shù)的閉包問(wèn)題(內(nèi)部函數(shù)與外部函數(shù)詳述)
python函數(shù)的閉包問(wèn)題(內(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ù)將會(huì)報(bào)錯(cuò)
>>> func2() Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'func2' is not defined
關(guān)于python的閉包問(wèn)題
如果試圖在一個(gè)內(nèi)部函數(shù)里對(duì)外部作用域(不包括外部函數(shù)的外部作用域)的變量進(jìn)行引用,內(nèi)部函數(shù)就會(huì)被認(rèn)為是閉包
>>> def FuncX(x): ... def FuncY(y): ... return x*y ... return FuncY
對(duì)于FuncY函數(shù)來(lái)說(shuō),對(duì)在FuncX函數(shù)的整個(gè)作用域(FuncY函數(shù)的非全局作用域的外部作用)的變量x進(jìn)行引用,自此就可以說(shuō)FuncY函數(shù)就是所謂的閉包
>>> f = FuncX(8) >>> f <function FuncY at 0x7f3a436fc2a8> >>> type(f) <type 'function'> >>> f(10) 80 >>> FuncX(7)(8) 56
由于閉包本身是基于內(nèi)部函數(shù)這一概念而來(lái),所以不能在外部函數(shù)的外部作用域?qū)?nèi)部函數(shù)進(jìn)行調(diào)用
>>> FuncY(8) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'FuncY' is not defined
既然是基于內(nèi)部函數(shù)這一概念而來(lái),自然對(duì)于內(nèi)部函數(shù)來(lái)說(shuō)對(duì)引用外部函數(shù)作用域內(nèi)的變量進(jìn)行修改,將會(huì)啟動(dòng)解釋器的屏蔽機(jī)制
>>> 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的左值此時(shí)是內(nèi)部函數(shù)作用域里的變量,此時(shí)試圖將沒(méi)有定義的數(shù)據(jù)進(jìn)行平方操作,因此報(bào)錯(cuò)
>>> 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ù)作用域的變量從而不會(huì)被屏蔽機(jī)制屏蔽掉,因?yàn)槿萜黝愋筒皇谴娣旁跅@锩?/p>
>>> 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èn)題詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Python 200行代碼實(shí)現(xiàn)一個(gè)滑動(dòng)驗(yàn)證碼過(guò)程詳解
這篇文章主要介紹了Python 200行代碼實(shí)現(xiàn)一個(gè)滑動(dòng)驗(yàn)證碼過(guò)程詳解,各種各樣的驗(yàn)證碼,比較高級(jí)的有滑動(dòng)、點(diǎn)選等樣式,看起來(lái)好像挺復(fù)雜的,但實(shí)際上它們的核心原理還是還是很清晰的,本文章大致說(shuō)明下這些驗(yàn)證碼的原理以及帶大家實(shí)現(xiàn)一個(gè)滑動(dòng)驗(yàn)證碼2019-07-07詳解python內(nèi)置常用高階函數(shù)(列出了5個(gè)常用的)
這篇文章主要介紹了python內(nèi)置常用高階函數(shù)(列出了5個(gè)常用的),通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02python實(shí)現(xiàn)批量按比例縮放圖片效果
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)批量按比例縮放圖片效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03在Python中封裝GObject模塊進(jìn)行圖形化程序編程的教程
這篇文章主要介紹了在Python中封裝GObject模塊進(jìn)行圖形化程序編程的教程,本文來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04Python讀寫文件模式和文件對(duì)象方法實(shí)例詳解
這篇文章主要介紹了Python讀寫文件模式和文件對(duì)象方法,結(jié)合實(shí)例形式詳細(xì)分析了Python文件操作常用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-09-09Django框架實(shí)現(xiàn)分頁(yè)顯示內(nèi)容的方法詳解
這篇文章主要介紹了Django框架實(shí)現(xiàn)分頁(yè)顯示內(nèi)容的方法,結(jié)合實(shí)例形式詳細(xì)分析了Django框架引入bootstrap樣式進(jìn)行分頁(yè)顯示相關(guān)步驟、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2019-05-05Python使用win32com實(shí)現(xiàn)的模擬瀏覽器功能示例
這篇文章主要介紹了Python使用win32com實(shí)現(xiàn)的模擬瀏覽器功能,結(jié)合實(shí)例形式分析了Python基于win32com模塊實(shí)現(xiàn)網(wǎng)頁(yè)的打開、登陸、加載等功能相關(guān)技巧,需要的朋友可以參考下2017-07-07用Python實(shí)現(xiàn)校園通知更新提醒功能
今天小編就為大家分享一篇用Python實(shí)現(xiàn)校園通知更新提醒功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11