日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python闭包详解函数_详解python函数的闭包问题(内部函数与外部函数详述)

發布時間:2024/7/5 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python闭包详解函数_详解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 "", 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

內部函數創建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函數的閉包問題詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的python闭包详解函数_详解python函数的闭包问题(内部函数与外部函数详述)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。