91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中內部函數與外部函數的閉包問題

發布時間:2021-08-26 11:23:00 來源:億速云 閱讀:119 作者:小新 欄目:開發技術

這篇文章主要介紹了python中內部函數與外部函數的閉包問題,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

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 "<stdin>", line 1, in <module>
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
<function FuncY at 0x7f3a436fc2a8>
>>> type(f)
<type 'function'>
>>> f(10)
80
>>> FuncX(7)(8)
56

由于閉包本身是基于內部函數這一概念而來,所以不能在外部函數的外部作用域對內部函數進行調用

>>> FuncY(8)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
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 "<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的左值此時是內部函數作用域里的變量,此時試圖將沒有定義的數據進行平方操作,因此報錯

>>> def Func1():
...   x = 233
...   def Func2():
...       x = 321
...       return x
...   return Func2()
... 
>>> Func1()
321

內部函數創建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中內部函數與外部函數的閉包問題”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和龙市| 望谟县| 班戈县| 太和县| 兴业县| 五大连池市| 大关县| 任丘市| 曲阳县| 从化市| 子洲县| 商城县| 赤城县| 霍邱县| 扶沟县| 外汇| 正宁县| 仙游县| 汝州市| 湄潭县| 泾源县| 上思县| 新宁县| 宁国市| 廊坊市| 科技| 始兴县| 屏南县| 天镇县| 巴中市| 龙口市| 托克逊县| 蓬溪县| 正蓝旗| 北碚区| 隆化县| 内黄县| 贡嘎县| 乡宁县| 大余县| 湖口县|