在python中内嵌函数可以引用外层函数作用域中的变量,并且可以通过某种操作来对其进行修改。
这里我们就可以使用到nonlocal语句来进行声名。我之前写过一篇global用法的文章,nonlocal的用法与global的用法很像,本篇博客的后面就会讲一下nonlocal和global的区别。
nonlocal语句的用法
语法:
允许内嵌函数修改定义在语法上位于外层的函数的作用域中的一个或者多个名称
用法:
nonlocal[变量名]
注意:
此语句仅适用于python3,在python2中内嵌函数可以使用外层作用域中通过赋值的所有名称,但不能进行修改;python3则可以使用并且可以进行修改。
语法实现:
def
dome_fun
(
)
:
num
=
0
def
dome_fun_1
(
)
:
nonlocal
num
num
+=
1
return
num
return
num
在这段dome里面,变量num既不是全局变量,也不是局部变量,而是外部内嵌函数的变量。
nonlocal与global的区别
在谈到nonlocal与global的区别之前,我们应该了解python中引用变量的顺序是什么样的。
python变量引用顺序:从当前作用域开始寻找变量,如果没找到就往上一层作用域寻找,没找到就再上一层。
具体步骤:当前作用域局部变量->外层作用域变量->再外层作用域变量->…->当前模块全局变量->pyhton内置变量
1、作用对象不同:
nonlocal作用于外部内嵌函数的变量;
global作用于全局变量。
2、global可以改变全局变量,同时可以定义新的全局变量;nonlocal只能改变外层函数变量,不能定义新的外层函数变量,并且nonlocal也不能改变全局变量。
3、声名:
global声名此变量为全局变量;nonlocal声名此变量与外层同名变量为相同的变量。
4、使用的范围不同:
global关键字可以用在任何地方,包括最上层函数中和嵌套函数中;
nonlocal关键字只能用于嵌套函数中,并且外层函数中必须定义了相应的局部变量,否则会发生错误