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 21 Python
Python3.2中Print函数用法实例详解
May 19 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
python 迭代器和iter()函数详解及实例
Mar 21 Python
Python实现基于C/S架构的聊天室功能详解
Jul 07 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
Python学习笔记之图片人脸检测识别实例教程
Mar 06 Python
超简单使用Python换脸实例
Mar 27 Python
python 读取数据库并绘图的实例
Dec 03 Python
基于python读取.mat文件并取出信息
Dec 16 Python
如何让python的运行速度得到提升
Jul 08 Python
Python爬虫实现自动登录、签到功能的代码
Aug 20 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/06/23 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
javascript 命名规则 变量命名规则
2010/02/25 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
基于Bootstrap实现tab标签切换效果
2020/04/15 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
webstorm添加*.vue文件支持
2018/05/08 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
[04:40]DOTA2-DPC中国联赛1月26日Recap集锦
2021/03/11 DOTA
简单介绍Python中的JSON模块
2015/04/08 Python
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
python 3.6.4 安装配置方法图文教程
2018/09/18 Python
python斐波那契数列的计算方法
2018/09/27 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
Python库安装速度过慢解决方案
2020/07/14 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
后勤人员自我鉴定
2013/10/20 职场文书
大学生创业计划书的格式要求
2013/12/29 职场文书
终止劳动合同协议书
2014/10/05 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python