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二分法实现实例
Nov 21 Python
Python自动化测试工具Splinter简介和使用实例
May 13 Python
介绍Python的@property装饰器的用法
Apr 28 Python
Python提取Linux内核源代码的目录结构实现方法
Jun 24 Python
Python爬虫包BeautifulSoup学习实例(五)
Jun 17 Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 Python
python实现图书借阅系统
Feb 20 Python
python 实现手机自动拨打电话的方法(通话压力测试)
Aug 08 Python
python安装virtualenv虚拟环境步骤图文详解
Sep 18 Python
python 读取.nii格式图像实例
Jul 01 Python
python中K-means算法基础知识点
Jan 25 Python
python process模块的使用简介
May 14 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
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
学习PHP Cookie处理函数
2016/08/09 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
使用js实现数据格式化
2014/12/03 Javascript
JavaScript异步加载浅析
2014/12/28 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
node.js中module.exports与exports用法上的区别
2016/09/02 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
如何在JavaScript中创建具有多个空格的字符串?
2020/02/23 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
javascript实现左右缓动动画函数
2020/11/25 Javascript
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
Python实现图片滑动式验证识别方法
2017/11/09 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
python实现可变变量名方法详解
2019/07/01 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
python @propert装饰器使用方法原理解析
2019/12/25 Python
django使用graphql的实例
2020/09/02 Python
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
浅谈react路由传参的几种方式
2021/03/23 Javascript
历史学专业毕业生求职信
2013/09/27 职场文书
九年级历史教学反思
2014/01/27 职场文书
详解python网络进程
2021/06/15 Python
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA
vue如何清除浏览器历史栈
2022/05/25 Vue.js