Python3中变量作用域nonlocal的总结
最近,在工作中踩到了一个关于Python3中nonlocal语句指定的变量作用域的坑。今天趁周六休息总结记录一下。
众所周知,Python中最常见的作用域定义如下:

但是,为了更加方便地在闭包函数中定义、引用变量,Python3新引入了nonlocal语句。
其代表的含义为:“非local、非global也非built-in,典型使用场景多见于闭包函数中内层函数需要引用外层函数定义的变量”;
其查找顺序为:“local--nonlocal--global--built-in”。
nonlocal语句相关举例如下:
1)错误的例子——闭包中内层函数引用了外层函数定义的变量但未使用nonlocal语句:

2)正确的例子——闭包中内层函数引用了外层函数定义的变量,同时使用了nonlocal语句:

Tips:
这里有个需要注意的地方,就是如果内层函数只是读取外层函数定义的变量而不改写,此时解释器只是按照作用域由近到远的顺序读取即可,不会报错。例如(特别注意下面截图跟1中截图红框标记的部分,二者唯一的区别正是1中对变量进行了改写而下面只是读取并未改写):

Python3中变量作用域nonlocal的总结的更多相关文章
- 控制器controller与指令中的link、controller中变量作用域的关系
angjualrjs中的作用域与原生js中的函数嵌套原理一致,都是存在作用域的继承.若在子控制器(同样包括在指令中的link或是controllerding中定义变量,此时指令中必须未使用scope独 ...
- C/C++语言中变量作用域:局部变量,全局变量,文件级变量
C/C++语言中的变量分为全局变量和局部变量. 这样的划分方式的根据是变量的可见范围或者叫做作用域. 1 局部变量 局部变量指的是定义在{}中的变量,其作用域也在这个范围内.尽管常见的局部变量都是定义 ...
- H5 Canvas | 画布中变量作用域与setInterval方法同步执行探究
Demo - 随机绘制圆环 实现思路: 将一个圆环的绘制分成100份,setInterval()方法定义每隔时间n绘制一段新的,每份的开始路径都是上一次的结束路径,实现步进绘制. 通过Math.ran ...
- erlang中变量作用域
http://erlangdisplay.iteye.com/blog/315452 _开头(包括_)在erlang可以是表明,这个变量可以存任意东西,就是我们常说的全匹配,_A一般来说就是表明这个东 ...
- python3的变量作用域规则和nonlocal关键字
也许你已经觉得自己可以熟练使用python并能胜任许多开发任务,所以这篇文章是在浪费你的时间.不过别着急,我们先从一个例子开始: i = 0 def f(): print(i) i += 1 prin ...
- Javascript中变量作用域(2)
多层函数调用取变量时,无论在哪里调用,要到创建此函数的作用域中取值,如果找不到再往上一级,直到全局变量. 外面定义了很多的全局的变量,下面我们来一个个理一下. 定义三个变量a,b,c;将A1函数赋值给 ...
- Go中变量作用域的小坑
直接上一实例: package main import "fmt" func main(){ fmt.Println("for start") ; a < ...
- jsp 中变量作用域:pageScope、requestScope、sessionScope、applicationScope
jsp 中,变量的作用域,一共有4种: pageScope:表示变量只能在本页面使用. requestScope:表示变量能在本次请求中使用. sessionScope:表示变量能在本次会话中使用. ...
- python3 之 变量作用域详解
作用域: 指命名空间可直接访问的python程序的文本区域,这里的 ‘可直接访问’ 意味着:对名称的引用(非限定),会尝试在命名空间中查找名称: L:local,局部作用域,即函数中定义的变量: E: ...
随机推荐
- 内网域渗透之MS14-068复现(CVE-2014-6324)
在做域渗透测试时,当我们拿到了一个普通域成员的账号后,想继续对该域进行渗透,拿到域控服务器权限.如果域控服务器存在MS14_068漏洞,并且未打补丁,那么我们就可以利用MS14_068快速获得域控服务 ...
- JDK下载安装与卸载详解
JDK下载安装 1. 下载: 推荐版本:JDK 8 (7.8目前广泛应用) 官网地址:https://www.oracle.com/cn/java/technologies/javase/javase ...
- go modules——HelloWorld示例
go modules--HelloWorld示例 go modules 存在的意义是方便代码的共享(虽然这会使自己开发过程中有一些小小的麻烦) 开发第一步,创建一个github仓库,然后克隆到本地 首 ...
- cnblogs blogs backup & node.js crawler
cnblogs blogs backup & node.js crawler refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访 ...
- TypeScript callback Object params
TypeScript callback Object params 回调函数 对象 参数 const func = (options = {}) => { // do somthing retu ...
- how to enable vue cli auto open the localhost url
how to enable vue cli auto open the localhost URL bad you must click the link by manually, waste of ...
- js spider
js spider https://gist.github.com/xgqfrms-GitHub/0bf82ff06037a0d1776c9f30033cbfd1 https://www.cnblog ...
- useState & useEffect
useState & useEffect https://overreacted.io/zh-hans/a-complete-guide-to-useeffect/ https://react ...
- ts 函数重载
class User { constructor(public readonly name: string, public readonly value: Function) {} } class D ...
- 12月15日BGV币行情分析
今日,DeFi市场格外精彩.各主流概念币种走势出现了涨跌各半的两极态势.笔者认为,由于并没有总体可以利好DeFi市场的基本面因素,所以各DeFi概念币种的涨跌态势,还是与各自的基本面和技术面走势相关. ...