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搜索指定目录的方法
Apr 29 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
Jan 20 Python
Python pass详细介绍及实例代码
Nov 24 Python
解决python2.7用pip安装包时出现错误的问题
Jan 23 Python
使用Python处理Excel表格的简单方法
Jun 07 Python
python2与python3中关于对NaN类型数据的判断和转换方法
Oct 30 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
Jun 17 Python
解决Tensorflow占用GPU显存问题
Feb 03 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
Mar 25 Python
基于Python实现视频的人脸融合功能
Jun 12 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
Jun 22 Python
Elasticsearch 基本查询和组合查询
Apr 19 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 编写的日历
2006/10/09 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
javascript 设计模式之单体模式 面向对象学习基础
2010/04/18 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
web前端开发JQuery常用实例代码片段(50个)
2015/08/28 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
Bootstrap按钮组实例详解
2017/07/03 Javascript
基于bootstrap实现多个下拉框同时搜索功能
2017/07/19 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
基于dataset的使用和图片延时加载的实现方法
2017/12/11 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
原生JS实现手动轮播图效果实例代码
2018/11/22 Javascript
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
2019/10/11 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
使用C语言扩展Python程序的简单入门指引
2015/04/14 Python
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
python 循环数据赋值实例
2019/12/02 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
Python接口测试get请求过程详解
2020/02/28 Python
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
C语言面试题
2015/10/30 面试题
秋季运动会广播稿大全
2014/02/17 职场文书
加多宝凉茶广告词
2014/03/18 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书
离婚协议书怎样才有法律效力
2014/10/10 职场文书
《刺客之王:C罗全景传记》:时代从来不会亏待手艺人
2019/11/28 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python
如何用PHP实现分布算法之一致性哈希算法
2021/05/26 PHP