python3中的nonlocal 与 global
nonlocal 与 global
nonlocal翻译是非本地,global翻译是全局,它们都是python3的新特性。如果以类C语言的思维去看这2个关键字,很可能觉得它们差不多。但实际上它们很不一样。
下面先说说global。顾名思义,global能将一个变量提升为全局, 但是这个关键字有个特别的语法要求,即不能同时定义和声明,如global a=1。
a = 1
def func():
print(a)
global a
a += 2
# SyntaxWarning: name 'a' is used prior to global declaration
func() #输出1
print(a) #输出3
不熟悉python的可能会举得上面的global有点多余,可能会倾向于下面这种写法:
a = 1
def func():
a += 2
func()
print(a)
可惜这么写只会报错UnboundLocalError: local variable 'a' referenced before assignment, 具体原因可以参考https://www.cnblogs.com/friedCoder/p/12571983.html
这种类C写法不能照搬到Python中,毕竟python是解释型语言,两者不可完全类比。
对于global再补充最后一个小点
def func():
global a
a = 1
print(a) #NameError: global name 'a' is not defined
def func():
global a
a = 1
func()
print(a) #输出1
可以发现python竟然还能直接在函数里面定义外部的全局变量,当然没有global是做不到的,不过这种写法很不好。
下面再来看看nonlocal
既然已经有一个处理全局的关键字了,那nonlocal就是一个处理局部变量的关键字。
a = 1
def outer():
a = 2
def inner():
print(a)
nonlocal a
a = 3
inner()
print(a)
outer()
print(a)
发现执行报错SyntaxError: name 'a' is used prior to nonlocal declaration, 因为函数inner里面a在声明nonlocal之前就被print调用了,这是不允许的, global一样。
a = 1
def outer():
a = 2
def inner():
nonlocal a
a = 3
inner()
print(a) #3
outer()
print(a) #1
可见nonlocal就是能引用外部环境的局部变量,遵守最近原则。
注意这里强调局部变量,下面都是不允许的:
a = 1
def outer():
def inner():
nonlocal a
a = 3
inner()
print(a)
outer()
####################################
def outer():
global a
def inner():
nonlocal a
a = 3
inner()
print(a)
outer()
报错SyntaxError: no binding for nonlocal 'a' found
从上面可以看出python中修改外部变量挺麻烦的,因此最好使用面向对象的编程方法,而非面向过程。
python3中的nonlocal 与 global的更多相关文章
- 第九天python3 闭包、nonlocal、默认值的作用域
闭包 自由变量:未在本地作用域中定义的变量,例如定义在内存函数外的外层函数的作用域中的变量: 闭包:出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量,就形成了闭包: 示例1: # -*- c ...
- Python3中变量作用域nonlocal的总结
最近,在工作中踩到了一个关于Python3中nonlocal语句指定的变量作用域的坑.今天趁周六休息总结记录一下. 众所周知,Python中最常见的作用域定义如下: 但是,为了更加方便地在闭包函数 ...
- Python3中的新特性(1)——新的语言特性
1.源代码编码和标识符 Python3假定源代码使用UTF-8编码.另外,关于标识符中哪些字符是合法的规则也放宽了.特别是,标识符可以包含代码点为U+0080及以上的任意有效Unico ...
- 函数的嵌套+nonlocal和global关键字(重点)
1.在函数中声明函数 在内部函数中使用变量的时候, 查找顺序: 先找自己 -> 上一层 -> 上一层..全局 -> 内置 # 函数的互相调用 # def func1(): # pri ...
- 关于Python3中函数:
# 关于Python3中函数: - 定义 定义函数使用关键字def,后接函数名和放在圆括号()中的可选参数列表,函数内容以冒号起始并且缩进.一般格式如下:``` def 函数名(参数列表): &quo ...
- Python3中的字符串函数学习总结
这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...
- Python3中使用PyMySQL连接Mysql
Python3中使用PyMySQL连接Mysql 在Python2中连接Mysql数据库用的是MySQLdb,在Python3中连接Mysql数据库用的是PyMySQL,因为MySQLdb不支持Pyt ...
- python3 中mlpy模块安装 出现 failed with error code 1的决绝办法(其他模块也可用本方法)
在python3 中安装其它模块时经常出现 failed with error code 1等状况,使的安装无法进行.而解决这个问题又非常麻烦. 接下来以mlpy为例,介绍一种解决此类安装问题的办法. ...
- python3中返回字典的键
我在看<父与子的编程之旅>的时候,有段代码是随机画100个矩形,矩形的大小,线条的粗细,颜色都是随机的,代码如下, import pygame,sys,random from pygame ...
随机推荐
- 《自拍教程45》Python_adb实时监控Logcat日志
接上一篇:adb命令_一键截取logcat日志, 有一天, 系统稳定性开发负责人找到我,希望我能在跑android 系统monkey的时候, 实时监控logcat的输出,如果一旦发现"jav ...
- [BUG]document.body.scrollTop=0不生效(回到顶部)
描述 让body回滚到最顶部,设置 document.body.scrollTop = 0; . 微信内,安卓设备可以,ios设备不可以. 原因 MDN中 scrollTop是这样定义的 一个元素 ...
- pytorch RNN层api的几个参数说明
classtorch.nn.RNN(*args, **kwargs) input_size – The number of expected features in the input x hidde ...
- Python习题集(十六)
每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! https://www.cnblogs.com/poloyy/category/1676599.html 题目 写一个函数repl ...
- Vulnhub 靶场 Os-hackNos WP
About Os-hackNos 描述 Difficulty : Easy to Intermediate Flag : 2 Flag first user And second root Learn ...
- 故事:走进JVM的世界(图文并茂)
注意!本文较长,建议先收藏再阅读.更多文章可以关注作者公众号:码上实战 你也可以 star 我的 GitHub上本文所属仓库:https://github.com/flyhero/MarkNote 说 ...
- 题解 P1002 【过河卒】
正文 简单描述一下题意: 士兵想要过河,他每一次可以往下走一格,也可以往右走一格,但马一步走到的地方是不能走的,问走到\(n\)行,\(m\)列有多少种走法 我们显然应该先根据马的位置将不能走的格子做 ...
- SpringBoot项目中应用Jedis和一些常见配置
优雅的使用Jedis Redis的Java客户端有很多,Jedis是其中使用比较广泛和性能比较稳定的一个.并且其API和RedisAPI命名风格类似,推荐大家使用 在项目中引入Jedis 可以通过Ma ...
- 一文彻底搞懂BP算法:原理推导+数据演示+项目实战(上篇)
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 反向传播算法(Backpropagation Algorithm, ...
- Windows下命令行MySQL安装
通过zip压缩包文件直接安装 1.下载链接 https://dev.mysql.com/downloads/mysql/ 下载好后解压移动文件夹 2.配环境变量 path路径追加 3.创建初始化文件 ...