Python中关键字nonlocal和global的声明与解析
一、Python中global与nonlocal声明
如下代码
a=10 deffoo(): a=100
执行foo()结果a还是10
函数中对变量的赋值,变量始终绑定到该函数的局部命名空间,使用global语句可以改变这种行为。
>>>a 10 >>>deffoo(): ...globala ...a=100 ... >>>a 10 >>>foo() >>>a 100
解析名称时首先检查局部作用域,然后由内而外一层层检查外部嵌套函数定义的作用域,如找不到搜索全局命令空间和内置命名空间。
尽管可以层层向外(上)查找变量,但是!..python2只支持最里层作用域(局部变量)和全局命令空间(gloabl),也就是说内部函数不能给定义在外部函数中的局部变量重新赋值,比如下面代码是不起作用的
defcountdown(start): n=start defdecrement(): n-=1
python2中,解决方法可以是是把修改值放到列表或字典中,python3中,可以使用nonlocal声明完成修改
defcountdown(start): n=start defdecrement(): nonlocaln n-=1
二、Pythonnonlocal与global关键字解析
nonlocal
首先,要明确nonlocal关键字是定义在闭包里面的。请看以下代码:
x=0 defouter(): x=1 definner(): x=2 print("inner:",x) inner() print("outer:",x) outer() print("global:",x)
结果
#inner:2 #outer:1 #global:0
现在,在闭包里面加入nonlocal关键字进行声明:
x=0 defouter(): x=1 definner(): nonlocalx x=2 print("inner:",x) inner() print("outer:",x) outer() print("global:",x)
结果
#inner:2 #outer:2 #global:0
看到区别了么?这是一个函数里面再嵌套了一个函数。当使用nonlocal时,就声明了该变量不只在嵌套函数inner()里面
才有效,而是在整个大函数里面都有效。
global
还是一样,看一个例子:
x=0 defouter(): x=1 definner(): globalx x=2 print("inner:",x) inner() print("outer:",x) outer() print("global:",x)
结果
#inner:2 #outer:1 #global:2
global是对整个环境下的变量起作用,而不是对函数类的变量起作用。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。