python闭包修改全局变量_python闭包探究一二
復習
python引用變量的順序: 當前作用域局部變量 -> 外層作用域變量 -> 當前模塊中的全局變量 -> python內置變量
global:聲明一個全局變量
nonlocal:用來在函數或其他作用域中使用外層(非全局)變量
變量生存期
我們寫個簡單的變量生存期的小例子
def transmit_to_space(message):
print(message)
print(transmit_to_space("Test message"))
print(message) # 報錯 NameError: name 'message' is not defined
嵌套函數
Python 允許函數中有函數,即為嵌套函數。
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"))
在嵌套函數中訪問了最外層函數的參數,結果我們是能正常訪問 message
閉包
我們將上面的最外層(enclosing function) 的返回值修改為返回嵌套函數的引用(Python一切皆對象)
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()
根據前面變量生存期例子,按理說 transmit_to_space("Burn the Sun!") 調用完 message 的生命周期應該結束了,fun2調用應該失敗才對,但是實際卻調用成功了。
其實這里涉及到了閉包,我們查看 fun2 的 __closure__ 屬性 (python2下是func_closure)。看到有一個cell對象,里面值就是 message 的內容。
所以閉包是: 嵌套定義在非全局作用域里面的函數能夠記住它在被定義的時候它所處的封閉命名空間。(只會記住被嵌套函數使用的值,如果enclosing function 里面還定義了其他的值,封閉作用域里面是不會有的)
看下面例子的變化
我們增加一個參數,但是嵌套函數中未使用這個參數,發現fun2就沒有再記住這個值。
總結
以上是生活随笔為你收集整理的python闭包修改全局变量_python闭包探究一二的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ant构建项目迁移到gradle_自动化
- 下一篇: 3dmax导出fbx ue4_Maya建