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