>>deffunc1():...print('func1running...')...deffunc2():...print('func2running...')...func2()...>>>func1()func1running...func2running...內(nèi)部函數(shù)func2作用域都在外部函數(shù)func1作用域之內(nèi)如果試圖在外部函數(shù)的外部調(diào)用內(nèi)部函數(shù)將會(huì)報(bào)錯(cuò)>>>func2()Traceback(mostre" />

日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

詳解python函數(shù)的閉包問題(內(nèi)部函數(shù)與外部函數(shù)詳述)

系統(tǒng) 1784 0

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ù)將會(huì)報(bào)錯(cuò)

            
>>> func2()
Traceback (most recent call last):
 File "
            
              ", line 1, in 
              
                
NameError: name 'func2' is not defined
              
            
          

關(guān)于python的閉包問題

如果試圖在一個(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ù)來說,對(duì)在FuncX函數(shù)的整個(gè)作用域(FuncY函數(shù)的非全局作用域的外部作用)的變量x進(jìn)行引用,自此就可以說FuncY函數(shù)就是所謂的閉包

            
>>> f = FuncX(8)
>>> f

            
              
>>> type(f)

              
                
>>> f(10)
80
>>> FuncX(7)(8)
56
              
            
          

由于閉包本身是基于內(nèi)部函數(shù)這一概念而來,所以不能在外部函數(shù)的外部作用域?qū)?nèi)部函數(shù)進(jìn)行調(diào)用

            
>>> FuncY(8)
Traceback (most recent call last):
 File "
            
              ", line 1, in 
              
                
NameError: name 'FuncY' is not defined
              
            
          

既然是基于內(nèi)部函數(shù)這一概念而來,自然對(duì)于內(nèi)部函數(shù)來說對(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 "
            
              ", line 1, in 
              
                
 File "
                
                  ", line 6, in Func1
 File "
                  
                    ", line 4, in Func2
UnboundLocalError: local variable 'x' referenced before assignment

                  
                
              
            
          

x*=x的左值此時(shí)是內(nèi)部函數(shù)作用域里的變量,此時(shí)試圖將沒有定義的數(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)槿萜黝愋筒皇谴娣旁跅@锩?

            
>>> 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ù)的閉包問題詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 泾源县| 桑植县| 巴青县| 固镇县| 宜宾市| 历史| 比如县| 临汾市| 页游| 万山特区| 常德市| 新民市| 玛沁县| 安宁市| 绥中县| 栾城县| 孟村| 江北区| 视频| 林州市| 乌什县| 阿坝县| 津南区| 龙州县| 伊宁县| 呼和浩特市| 龙门县| 兴仁县| 苏尼特左旗| 安图县| 杭锦旗| 汶上县| 获嘉县| 揭阳市| 波密县| 泾川县| 芦山县| 临湘市| 山阴县| 泾源县| 北票市|