>>deffunc1():...print('func1running...')...deffunc2():...print('func2running...')...func2()...>>>func1()func1running...func2running...內部函數func2作用域都在外部函數func1作用域之內如果試圖在外部函數的外部調用內部函數將會報錯>>>func2()Traceback(mostre" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

詳解python函數的閉包問題(內部函數與外部函數詳述)

系統 1570 0

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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 毛片网站免费 | 一级黄色录像视频 | 国产精品成人第一区 | 九九九久久久 | 久久久久琪琪免费影院 | 国产精品19禁在线观看2021 | 亚洲国产精品热久久 | 9966久久精品免费看国产 | 狠狠插狠狠干 | 欧美精品久久久久久久久大尺度 | 91九九| 久久日韩精品激情 | 日本精品一二三区 | 在线播放亚洲精品富二代91 | 日本免费一区二区三区 | 在线观看免费精品国产 | 国产亚洲高清在线精品99 | 久久香蕉国产线看观看精品蕉 | 亚洲视频免费观看 | 久久精品视频一区二区三区 | 91精品国产91 | 久久99国产精品一区二区 | 亚洲最大网 | 国产精品1区2区3区 国产精品1区2区3区在线播放 | 一级毛片免费完整视频 | 亚洲人成自拍网站在线观看忄 | 久久夜色tv网站免费影院 | 台湾亚洲精品一区二区tv | 天天拍夜夜添久久精品免费 | 久99久精品视频免费观看v | 麻豆精品 | 亚洲毛片 | 亚洲欧美日韩综合一区久久 | 欧美色综合高清免费 | 亚洲综合区小说区激情区噜噜 | 国内精品久久久久久久影视麻豆 | 91亚洲国产三上悠亚在线 | 亚洲欧美日韩精品高清 | 五月婷婷在线观看 | 视频一区二区欧美日韩在线 | 在线成人aa在线看片 |