python闭包修改全局变量_python闭包探究一二
復(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)題。
- 上一篇: ant构建项目迁移到gradle_自动化
- 下一篇: 3dmax导出fbx ue4_Maya建