python nonlocal 的具體原理


很多文章都大概列了下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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM