Python3中 对local和nonlocal 关键字的改善认识(新手向)
nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
nonlocal用于声明,修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量,如下实例:
#!/usr/bin/python3
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()
结果如下:
100
100
当时学习的时候对于inner()输出的num值还可以理解,但是对于outer输出的num值就觉得不理解了,为什么不是10,毕竟在outer()里面已经有他自己的局部变量应该不会被修改,后来自己加多测试输出之后就廓然开朗啦了,示例如下:
def outer():
num =10
def inner(): nonlocal num # nonlocal关键字声明 print('inner-nonlocal-num',num) num = 100 print('inner-local-num',num)
print('outer-local-num',num) inner() print('outer-inner-local-num',num)outer()
结果:
outer-local-num 10
inner-nonlocal-num 10
inner-local-num 100
outer-inner-local-num 100
一看是不是就明白啦,两段代码不同之处只是在变量发生改变之前增加输出结果,从执行顺序看出:
1. 首先输出outer()本局变量num的值:10
2. 调用inner(),用nonlocal声明使用外部变量num(10),因此此时输出的是外部变量outer().num: 10
3. inner()内部生成本局变量num = 100,所以第三次输出的是inner.num的值, 也就是100.
实际上inner内部仅有一个num=100的本局变量,第二次输出的只是在inner函数里输出外部函数的变量的值。
4. 第四次输出的num值是调用了inner()后的num值,实际上inner()里面只有1个num=100的局部变量,因此第四次输出的就是inner().num: 也就是100.
此时重新看第一段代码对比之后就知道为什么输出这样的值了,
最后最后,学习的时候,多思考多加测试数据是真的会帮助理解的哟~
---------------------
作者:青创空间-小小L
来源:CSDN
原文:https://blog.csdn.net/luosongqing/article/details/75052763
版权声明:本文为博主原创文章,转载请附上博文链接!
Python3中 对local和nonlocal 关键字的改善认识(新手向)的更多相关文章
- 如何在Python 2.X中也达到类似nonlocal关键字的效果
nonlocal关键字时Python 3.X中引入的,目的是让内层函数可以修改外层函数的变量值,而该关键字在Python 2.X中是不存在的.那么,要在Python 2.X中达到类型达到类似nonlo ...
- global与nonlocal关键字
在Python中,当引用一个变量的时候,对这个变量的搜索是按找本地作用域(Local).嵌套作用域(Enclosing function locals).全局作用域(Global).内置作用域(bui ...
- Python3中变量作用域nonlocal的总结
最近,在工作中踩到了一个关于Python3中nonlocal语句指定的变量作用域的坑.今天趁周六休息总结记录一下. 众所周知,Python中最常见的作用域定义如下: 但是,为了更加方便地在闭包函数 ...
- global 和 nonlocal关键字
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了. def fun(): global num1 num1=2 print("函数内修改后num1=&qu ...
- Python 全局变量和局部变量,global 和 nonlocal关键字
全局变量和局部变量 全局变量:定义在函数外的变量 局部变量:定义在函数内部变量 获取变量值时候先获取当前作用域变量名称和变量值,如果没找到到上一层作用域招变量的值,在没有就报错,先获 ...
- Python3中的新特性(1)——新的语言特性
1.源代码编码和标识符 Python3假定源代码使用UTF-8编码.另外,关于标识符中哪些字符是合法的规则也放宽了.特别是,标识符可以包含代码点为U+0080及以上的任意有效Unico ...
- [python]global与nonlocal关键字
在Python中,当引用一个变量的时候,对这个变量的搜索是按找本地作用域(Local).嵌套作用域(Enclosing function locals).全局作用域(Global).内置作用域(bui ...
- Python中的global和nonlocal
在Python中,一个变量的scope范围从小到大分成4部分:Local Scope(也可以看成是当前函数形成的scope),Enclosing Scope(简单来说,就是外层函数形成的scope), ...
- global、nonlocal关键字
一:global:在函数内部引用/声明全局变量 在自定义函数时,有时候需要引用函数外的一些全局变量,如果不需要修改全局变量的内容,则可以直接引用,像下面这样: c = 999 def func(): ...
随机推荐
- Archiving not possible: No primary destinations errors
If space ran out in an archive destination, after you fix the problem, you may still recieve the fol ...
- hdu 分类
HDU分类 http://www.cnblogs.com/ACMan/archive/2012/05/26/2519550.html#2667329 努力A完.方便自己系统A题 不断更新中...... ...
- Lucene、Compass学习以及与SSH的整合
一.准备 个人在学习中采用Struts2 + Hibernate3.2 + Spring2.5 + Compass2.2.0, 一下图片为本次学习中用到的jar包: 图中圈出的jar包为本次学习的主要 ...
- SpringBoot自动配置的源码解析
首先,写源码分析真的很花时间,所以希望大家转的时候也请注明一下,Thanks♪(・ω・)ノ SpringBoot最大的好处就是对于很多框架都默认的配置,让我们开发的时候不必为了大一堆的配置文件头疼,关 ...
- SQL SERVER 2012 第三章 使用INSERT语句添加数据
INSERT [TOP (<expression>) [PERCENT] [INTO] <tabular object>[(column list)][OUTPUT <o ...
- python学习之-- 事件驱动模型
目前主流的网络驱动模型:事件驱动模型 事件驱动模型:也属于生产者/消费者结构,通过一个队列,保存生产者触发的事件,队列另一头是一个循环从队列里不断的提取事件.大致流程如下:1:首先生成一个事件消息队列 ...
- UVA 11827 Maximum GCD【GCD,stringstream】
这题没什么好说的,但是输入较特别,为此还WA了一次... 题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge& ...
- Codeforces 658C Bear and Forgotten Tree 3【构造】
题目链接: http://codeforces.com/contest/658/problem/C 题意: 给定结点数,树的直径(两点的最长距离),树的高度(1号结点距离其他结点的最长距离),写出树边 ...
- Vue基础学习
使用vue-cli构建初始化vue项目 vue init webpack myfirst 项目截图:(开发工具:webStorm) 主要练习了vue的基本指令:v-bind.v-if.v-show.v ...
- http 连接失败重连机制
1.我们做web开发时,需要经常使用httpclient来请求http服务,有时为了安全起见,服务提供方会提供多个http地址,这样如果我们请求某个ip出现异常,可以重试其他的ip地址,来尽量保证系统 ...