詳解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)文章
對(duì)Tensorflow中的變量初始化函數(shù)詳解
今天小編就為大家分享一篇對(duì)Tensorflow中的變量初始化函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Python爬蟲之Selenium中frame/iframe表單嵌套頁(yè)面
這篇文章主要介紹了Python爬蟲之Selenium中frame/iframe表單嵌套頁(yè)面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Python中免驗(yàn)證跳轉(zhuǎn)到內(nèi)容頁(yè)的實(shí)例代碼
在本篇文章里小編給大家整理的是一篇關(guān)于Python中免驗(yàn)證跳轉(zhuǎn)到內(nèi)容頁(yè)的實(shí)例代碼,有興趣的朋友們可以學(xué)習(xí)分享下。2020-10-10
讓Python程序定時(shí)執(zhí)行的8種方法整理
在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),一種方式是采用?Linux?系統(tǒng)自帶的?crond?結(jié)合命令行實(shí)現(xiàn),另外一種方式是直接使用Python。本文整理了一下?Python?定時(shí)任務(wù)的實(shí)現(xiàn)方式,希望對(duì)大家有所幫助2023-01-01
如何利用Python快速統(tǒng)計(jì)文本的行數(shù)
這篇文章主要介紹了如何利用Python快速統(tǒng)計(jì)文本的行數(shù),要快速統(tǒng)計(jì)一個(gè)文本文件中的行數(shù),其實(shí)就是要統(tǒng)計(jì)這個(gè)文本文件中換行符的個(gè)數(shù),下面我們就一起進(jìn)入文章看看具體的操作過(guò)程吧2021-12-12
python命令行參數(shù)argparse模塊基本用法詳解
argparse?是python自帶的命令行參數(shù)解析包,可以用來(lái)方便地讀取命令行參數(shù),這篇文章主要介紹了python命令行參數(shù)-argparse模塊基本用法,需要的朋友可以參考下2023-01-01
跟老齊學(xué)Python之大話題小函數(shù)(1)
今天本講要講什么呢?今天要介紹幾個(gè)python中的小函數(shù),這幾個(gè)函數(shù)都是從函數(shù)式編程借鑒過(guò)來(lái)的,它們就是:filter、map、reduce、lambda、yield 有了它們,最大的好處是程序更簡(jiǎn)潔2014-10-10
Python實(shí)現(xiàn)字典按照value進(jìn)行排序的方法分析
這篇文章主要介紹了Python實(shí)現(xiàn)字典按照value進(jìn)行排序的方法,結(jié)合實(shí)例形式分析了Python字典按照value進(jìn)行排序的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12

