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的urllib库提交WEB表单
Feb 24 Python
Python生成随机密码
Mar 10 Python
python实现简单爬虫功能的示例
Oct 24 Python
python中urllib.unquote乱码的原因与解决方法
Apr 24 Python
Python爬虫实现百度图片自动下载
Feb 04 Python
python 定时器,轮询定时器的实例
Feb 20 Python
如何为Python终端提供持久性历史记录
Sep 03 Python
python实现从wind导入数据
Dec 03 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
Feb 07 Python
利用Python脚本批量生成SQL语句
Mar 04 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
Apr 22 Python
实例讲解Python中sys.argv[]的用法
Jun 03 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注释实例技巧
2008/10/03 PHP
php导入模块文件分享
2015/03/17 PHP
PHP可变函数学习小结
2015/11/29 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
Angular设置title信息解决SEO方面存在问题
2016/08/19 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
Node.js创建HTTP文件服务器的使用示例
2018/05/11 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
Python中的闭包实例详解
2014/08/29 Python
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
python如何获取服务器硬件信息
2017/05/11 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
python列表生成器迭代器实例解析
2019/12/19 Python
Python之Class&Object用法详解
2019/12/25 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
师范学院毕业生求职信范文
2013/12/26 职场文书
入党自我鉴定
2014/03/25 职场文书
美术学专业求职信
2014/07/23 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
anaconda python3.8安装后降级
2021/06/11 Python