Python3 中的nonlocal用法


nonlocal是在Python3.2之后引入的一個關鍵字,它是用在封裝函數中的。百度兩者區別講的也不清楚,用法還是沒說清楚,查看官方文檔,更是晦澀難懂,所以在此做一下學習筆記。


我先說一下官網的nonlocal的用法:

 非局部聲明變量指代的已有標識符是最近外面函數的已聲明變量,但是不包括全局變量。這個是很重要的,因為綁定的默認行為是首先搜索本地命名空間。nonlocal聲明的變量只對局部起作用,離開封裝函數,那么該變量就無效。

非局部聲明不像全局聲明,我們必須在封裝函數前面事先聲明該變量

非局部聲明不能與局部范圍的聲明沖突

官網的解釋雖然很好,但是不好理解,我們直接使用代碼進行理解:

 1 count = 1
 2 
 3 def a():
 4     count = 'a函數里面'    #如果不事先聲明,那么函數b中的nonlocal就會報錯
 5     def b():
 6         nonlocal count
 7         print(count)
 8         count = 2
 9     b()
10     print(count)
11 
12 if __name__ == '__main__':
13     a()
14     print(count)

運行結果是:

a函數里面
2
1

該代碼就可以很好的解釋了,第一行的count和a()函數中的count是兩個變量,而a()函數中的count變量只是在該函數內部起作用,因為它是一個局部變量。

nonlocal只能在封裝函數中使用,在外部函數先進行聲明,在內部函數進行nonlocal聲明,這樣在b()函數中的count與a()中的count是同一個變量。

nonlocal錯誤的使用方法

1.在外部函數進行聲明

 1 count = 1
 2 
 3 def a():
 4     #nonlocal count    #這種聲明方法肯定報錯,
 5     def b():
 6         nonlocal count    #在a()函數中沒有提前聲明,所以報錯
 7         print(count)
 8         count = 2
 9     b()
10     print(count)
11 
12 if __name__ == '__main__':
13     a()
14     print(count)

報錯代碼:

  File "G:/學習/擴充學習/Python/程序/PyCharm/test.py", line 5
    nonlocal count
    ^
SyntaxError: no binding for nonlocal 'count' found

2.外部函數中變量聲明為global

 1 count = 1
 2 
 3 def a():
 4     global count
 5     count = 'a函數里面'
 6     def b():
 7         nonlocal count
 8         print(count)
 9         count = 2
10     b()
11     print(count)
12 
13 if __name__ == '__main__':
14     a()
15     print(count)

報錯代碼:

  File "G:/學習/擴充學習/Python/程序/PyCharm/test.py", line 7
    nonlocal count
    ^
SyntaxError: no binding for nonlocal 'count' found

 


免責聲明!

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



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