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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python闭包修改全局变量_python闭包探究一二

發(fā)布時(shí)間:2024/10/8 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python闭包修改全局变量_python闭包探究一二 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

復(fù)習(xí)

python引用變量的順序: 當(dāng)前作用域局部變量 -> 外層作用域變量 -> 當(dāng)前模塊中的全局變量 -> python內(nèi)置變量

global:聲明一個(gè)全局變量

nonlocal:用來(lái)在函數(shù)或其他作用域中使用外層(非全局)變量

變量生存期

我們寫(xiě)個(gè)簡(jiǎn)單的變量生存期的小例子

def transmit_to_space(message):

print(message)

print(transmit_to_space("Test message"))

print(message) # 報(bào)錯(cuò) NameError: name 'message' is not defined

嵌套函數(shù)

Python 允許函數(shù)中有函數(shù),即為嵌套函數(shù)。

def transmit_to_space(message):

"This is the enclosing function"

def data_transmitter():

"The nested function"

print(message)

data_transmitter()

print(transmit_to_space("Test message"))

在嵌套函數(shù)中訪問(wèn)了最外層函數(shù)的參數(shù),結(jié)果我們是能正常訪問(wèn) message

閉包

我們將上面的最外層(enclosing function) 的返回值修改為返回嵌套函數(shù)的引用(Python一切皆對(duì)象)

def transmit_to_space(message):

"This is the enclosing function"

def data_transmitter():

"The nested function"

print(message)

return data_transmitter

fun2 = transmit_to_space("Burn the Sun!")

fun2()

根據(jù)前面變量生存期例子,按理說(shuō) transmit_to_space("Burn the Sun!") 調(diào)用完 message 的生命周期應(yīng)該結(jié)束了,fun2調(diào)用應(yīng)該失敗才對(duì),但是實(shí)際卻調(diào)用成功了。

其實(shí)這里涉及到了閉包,我們查看 fun2 的 __closure__ 屬性 (python2下是func_closure)。看到有一個(gè)cell對(duì)象,里面值就是 message 的內(nèi)容。

所以閉包是: 嵌套定義在非全局作用域里面的函數(shù)能夠記住它在被定義的時(shí)候它所處的封閉命名空間。(只會(huì)記住被嵌套函數(shù)使用的值,如果enclosing function 里面還定義了其他的值,封閉作用域里面是不會(huì)有的)

看下面例子的變化

我們?cè)黾右粋€(gè)參數(shù),但是嵌套函數(shù)中未使用這個(gè)參數(shù),發(fā)現(xiàn)fun2就沒(méi)有再記住這個(gè)值。

總結(jié)

以上是生活随笔為你收集整理的python闭包修改全局变量_python闭包探究一二的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。