python函數的閉包問題(內嵌函數)
>>> def func1(): ... print ('func1 running...') ... def func2(): ... print ('func2 running...') ... func2() ... >>> func1() func1 running... func2 running...
內部函數func2作用域都在外部函數func1作用域之內
如果試圖在外部函數的外部調用內部函數將會報錯
>>> func2() Traceback (most recent call last): File "", line 1, in NameError: name 'func2' is not defined
關于python的閉包問題
如果試圖在一個內部函數里對外部作用域(不包括外部函數的外部作用域)的變量進行引用,內部函數就會被認為是閉包
>>> def FuncX(x): ... def FuncY(y): ... return x*y ... return FuncY
對于FuncY函數來說,對在FuncX函數的整個作用域(FuncY函數的非全局作用域的外部作用)的變量x進行引用,自此就可以說FuncY函數就是所謂的閉包
>>> f = FuncX(8) >>> f>>> type(f) >>> f(10) 80 >>> FuncX(7)(8) 56
由于閉包本身是基于內部函數這一概念而來,所以不能在外部函數的外部作用域對內部函數進行調用
>>> FuncY(8) Traceback (most recent call last): File "", line 1, in NameError: name 'FuncY' is not defined
既然是基于內部函數這一概念而來,自然對于內部函數來說對引用外部函數作用域內的變量進行修改,將會啟動解釋器的屏蔽機制
>>> def Func1(): ... x = 233 ... def Func2(): ... x *=x ... return x ... return Func2() ... >>> Func1() Traceback (most recent call last): File "", line 1, in File " ", line 6, in Func1 File " ", line 4, in Func2 UnboundLocalError: local variable 'x' referenced before assignment
x*=x的左值此時是內部函數作用域里的變量,此時試圖將沒有定義的數據進行平方操作,因此報錯
>>> def Func1(): ... x = 233 ... def Func2(): ... x = 321 ... return x ... return Func2() ... >>> Func1() 321
內部函數創(chuàng)建x變量并且屏蔽外部函數作用域內的x變量
python3之前的解決辦法
應用容器類型(list,tuple之類的)存放外部函數作用域的變量從而不會被屏蔽機制屏蔽掉,因為容器類型不是存放在棧里面
>>> def Func1(): ... x = [233] ... def Func2(): ... x[0] *= x[0] ... return x[0] ... return Func2() ... >>> Func1() 54289
python3之后的解決辦法:nonlocal關鍵字
>>> def Func1(): ... x = 233 ... def Func2(): ... nonlocal x ... x *= x ... return x ... return Func2() ... >>> Func1() 54289
以上所述是小編給大家介紹的python函數的閉包問題詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
