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查找函数f(x)=0根的解决方法
May 07 Python
python获取命令行输入参数列表的实例代码
Jun 23 Python
python pygame模块编写飞机大战
Nov 20 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
python 阶乘累加和的实例
Feb 01 Python
python中import与from方法总结(推荐)
Mar 21 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
Python+Appium实现自动化测试的使用步骤
Mar 24 Python
python 实现PIL模块在图片画线写字
May 16 Python
python如何实现图片压缩
Sep 11 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 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权限分配的实现代码
2013/04/28 PHP
PHP缓存集成库phpFastCache用法
2014/12/15 PHP
php递归法读取目录及文件的方法
2015/01/30 PHP
php基于curl扩展制作跨平台的restfule 接口
2015/05/11 PHP
php类的自动加载操作实例详解
2016/09/28 PHP
在线游戏大家来找茬II
2006/09/30 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
JavaScript多线程详解
2015/08/12 Javascript
最简单的tab切换实例代码
2016/05/13 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
详解vue-cli中使用rem,vue自适应
2019/05/06 Javascript
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
2018/02/13 Python
Python使用pip安装pySerial串口通讯模块
2018/04/20 Python
快速查找Python安装路径方法
2020/02/06 Python
python 实现任务管理清单案例
2020/04/25 Python
python 爬虫请求模块requests详解
2020/12/04 Python
英国健身仓库:Bodybuilding Warehouse
2019/03/06 全球购物
某公司面试题
2012/03/05 面试题
Ajax请求总共有多少种Callback
2016/07/17 面试题
优秀毕业生自荐信范文
2014/01/01 职场文书
文科生自我鉴定
2014/02/15 职场文书
职称评定自我鉴定
2014/03/18 职场文书
离婚协议书怎样才有法律效力
2014/10/10 职场文书
就业推荐表院系意见
2015/06/05 职场文书
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python