Python3中的nonlocal⽤法
nonlocal是在Python3.2之后引⼊的⼀个关键字,它是⽤在封装函数中的。百度两者区别讲的也不清楚,⽤法还是没说清楚,查看官⽅⽂档,更是晦涩难懂,所以在此做⼀下学习笔记。
我先说⼀下官⽹的nonlocal的⽤法:
局部声明变量指代的已有标识符是最近外⾯函数的已声明变量,但是不包括全局变量。这个是很重要的,因为绑定的默认⾏为是⾸先搜索本地命名空间。nonlocal声明的变量只对局部起作⽤,离开封装函数,那么该变量就⽆效。
⾮局部声明不像全局声明,我们必须在封装函数前⾯事先声明该变量
⾮局部声明不能与局部范围的声明冲突
官⽹的解释虽然很好,但是不好理解,我们直接使⽤代码进⾏理解:
1 count = 1
2
3def a():
4    count = 'a函数⾥⾯'    #如果不事先声明,那么函数b中的nonlocal就会报错
5def b():
6        nonlocal count
7print(count)
8        count = 2
9    b()
10print(count)
11
12if__name__ == '__main__':
13    a()
14print(count)
运⾏结果是:
a函数⾥⾯
2
记住我1
该代码就可以很好的解释了,第⼀⾏的count和a()函数中的count是两个变量,⽽a()函数中的count变量只是在该函数内部起作⽤,因为它是⼀个局部变量。
nonlocal只能在封装函数中使⽤,在外部函数先进⾏声明,在内部函数进⾏nonlocal声明,这样在b()函数中的count与a()中的count是同⼀个变量。
nonlocal错误的使⽤⽅法
1.在外部函数进⾏声明
1 count = 1
2
3def a():
4#nonlocal count    #这种声明⽅法肯定报错,
5def b():
6        nonlocal count    #在a()函数中没有提前声明,所以报错
7print(count)
8        count = 2
9    b()
10print(count)
11
12if__name__ == '__main__':
13    a()
14print(count)
报错代码:
File "G:/学习/扩充学习/Python/程序/PyCharm/test.py", line 5
nonlocal count
^
SyntaxError: no binding for nonlocal 'count' found
2.外部函数中变量声明为global
1 count = 1
2
3def a():
4global count
5    count = 'a函数⾥⾯'
6def b():
7        nonlocal count
8print(count)
9        count = 2
10    b()
11print(count)
12
13if__name__ == '__main__':
14    a()
15print(count)
报错代码:
File "G:/学习/扩充学习/Python/程序/PyCharm/test.py", line 7    nonlocal count
^
SyntaxError: no binding for nonlocal 'count' found