Python中关键字nonlocal和global的声明与解析


Posted in Python onMarch 12, 2017

一、Python中global与nonlocal 声明

如下代码

a = 10 
 
def foo(): 
 a = 100

执行foo() 结果 a 还是10

函数中对变量的赋值,变量始终绑定到该函数的局部命名空间,使用global 语句可以改变这种行为。

>>> a 
10 
>>> def foo(): 
...  global a 
...  a = 100 
... 
>>> a 
10 
>>> foo() 
>>> a 
100

解析名称时首先检查局部作用域,然后由内而外一层层检查外部嵌套函数定义的作用域,如找不到搜索全局命令空间和内置命名空间。

尽管可以层层向外(上)查找变量,但是! ..python2 只支持最里层作用域(局部变量)和全局命令空间(gloabl),也就是说内部函数不能给定义在外部函数中的局部变量重新赋值,比如下面代码是不起作用的

def countdown(start): 
 n = start 
 def decrement(): 
  n -= 1

python2 中,解决方法可以是是把修改值放到列表或字典中,python3 中,可以使用nonlocal 声明完成修改

def countdown(start): 
 n = start 
 def decrement(): 
  nonlocal n 
  n -= 1

二、Python nonlocal 与 global 关键字解析

nonlocal

首先,要明确 nonlocal 关键字是定义在闭包里面的。请看以下代码:

x = 0
def outer():
 x = 1
 def inner():
  x = 2
  print("inner:", x)

 inner()
 print("outer:", x)

outer()
print("global:", x)

结果

# inner: 2
# outer: 1
# global: 0

现在,在闭包里面加入nonlocal关键字进行声明:

x = 0
def outer():
 x = 1
 def inner():
  nonlocal x
  x = 2
  print("inner:", x)

 inner()
 print("outer:", x)

outer()
print("global:", x)

结果

# inner: 2
# outer: 2
# global: 0

看到区别了么?这是一个函数里面再嵌套了一个函数。当使用 nonlocal 时,就声明了该变量不只在嵌套函数inner()里面
才有效, 而是在整个大函数里面都有效。

global

还是一样,看一个例子:

x = 0
def outer():
 x = 1
 def inner():
  global x
  x = 2
  print("inner:", x)

 inner()
 print("outer:", x)

outer()
print("global:", x)

结果

# inner: 2
# outer: 1
# global: 2

global 是对整个环境下的变量起作用,而不是对函数类的变量起作用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python+tkinter使用40行代码实现计算器功能
Jan 30 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
python requests 测试代理ip是否生效
Jul 25 Python
解决pycharm无法识别本地site-packages的问题
Oct 13 Python
python 判断文件还是文件夹的简单实例
Jun 10 Python
python构建指数平滑预测模型示例
Nov 21 Python
Flask项目中实现短信验证码和邮箱验证码功能
Dec 05 Python
使用Python串口实时显示数据并绘图的例子
Dec 26 Python
tensorflow 实现从checkpoint中获取graph信息
Feb 10 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
Feb 11 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
python中翻译功能translate模块实现方法
Dec 17 Python
Python中模块string.py详解
Mar 12 #Python
Python中第三方库Requests库的高级用法详解
Mar 12 #Python
python 获取网页编码方式实现代码
Mar 11 #Python
python 爬虫出现403禁止访问错误详解
Mar 11 #Python
Python如何读取MySQL数据库表数据
Mar 11 #Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
Mar 11 #Python
Python搭建HTTP服务器和FTP服务器
Mar 09 #Python
You might like
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
PHP7 字符串处理机制修改
2021/03/09 PHP
浅析js中2个等号与3个等号的区别
2013/08/06 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
js小数运算出现多位小数如何解决
2015/10/08 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
Vue 监听列表item渲染事件方法
2018/09/06 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
2020/02/07 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
对python中GUI,Label和Button的实例详解
2019/06/27 Python
python实现简单坦克大战
2020/03/27 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
德国最大的网上鞋店之一:Schuhe24.de
2017/06/10 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
小班秋游活动方案
2014/02/22 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
离职报告范文
2014/11/04 职场文书
2015年公务员个人工作总结
2015/04/24 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android
全新239军机修复记
2022/04/05 无线电
hive数据仓库新增字段方法
2022/06/25 数据库