最近,在工作中踩到了一个关于Python3中nonlocal语句指定的变量作用域的坑。今天趁周六休息总结记录一下。
众所周知,Python中最常见的作用域定义如下:
但是,为了更加方便地在闭包函数中定义、引用变量,Python3新引入了nonlocal语句。
其代表的含义为:“非local、非global也非built-in,典型使用场景多见于闭包函数中内层函数需要引用外层函数定义的变量”;
其查找顺序为:“local--nonlocal--global--built-in”。
nonlocal语句相关举例如下:
1)错误的例子——闭包中内层函数引用了外层函数定义的变量但未使用nonlocal语句:
2)正确的例子——闭包中内层函数引用了外层函数定义的变量,同时使用了nonlocal语句:
Tips:
这里有个需要注意的地方,就是如果内层函数只是读取外层函数定义的变量而不改写,此时解释器只是按照作用域由近到远的顺序读取即可,不会报错。例如(特别注意下面截图跟1中截图红框标记的部分,二者唯一的区别正是1中对变量进行了改写而下面只是读取并未改写):