很多文章都大概列了下nonlocal的具體用法,比如看到幾篇文章寫的
“nonlocal關鍵字用來在函數或其他作用域中使用外層(非全局)變量”
看完以后我感覺自己是懂了,但光從這句話來說還沒完全理解它的真實含義nonlocal
def make_average():
series=[]
def average(new_value):
series.append(new_value)
total = sum(series)
return. total/len(series)
return averager
average = make_average()
average(10). -> 10
average(11). - >10.5
series 是make_average 的局部變量,當average=make_average()以后,make_average()已經返回了,本地作用域已經一去不返
其實在average函數中 series是自由變量,並未在本地作用域中綁定的變量
可以通過average__code__.co_varname 查看局部變量, average.__code__.co_freevars 查看自由變量
series 綁定在返回的average的__closure__屬性中, average.__closure__, average__closure__[0].cell_contents 里面存儲series里的數據
但如果把series改為了int 類型的不可變類型在average里面嘗試改變它的值時就會報錯,這時候如何處理,就需要加nonlocal ,它的作用就是變量申明為自由變量
結論:
如果在內部函數中只是僅僅讀外部變量,可以不在此變量前加nonlocal
如果在內部函數中嘗試進行修改外部變量,且外部變量為不可變類型,則需要在變量前加nonlocal,如果變量為可變類型,則不需要添加nonlocal