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实现自动更换ip的方法
May 05 Python
Python文件读取的3种方法及路径转义
Jun 21 Python
举例讲解Linux系统下Python调用系统Shell的方法
Nov 07 Python
requests和lxml实现爬虫的方法
Jun 11 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
浅谈Django的缓存机制
Aug 23 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
Django 框架模型操作入门教程
Nov 05 Python
python实现用类读取文件数据并计算矩形面积
Jan 18 Python
PyCharm+PyQt5+QtDesigner配置详解
Aug 12 Python
一篇文章教你用python画动态爱心表白
Nov 22 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
Dec 04 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
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件。
2011/12/26 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
ie9 提示'console' 未定义问题的解决方法
2014/03/20 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
Lua表达式和控制结构学习笔记
2014/12/15 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
node跨域请求方法小结
2017/08/25 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
Nodejs中crypto模块的安全知识讲解
2018/01/03 NodeJs
Python中scatter函数参数及用法详解
2017/11/08 Python
在Pycharm terminal中字体大小设置的方法
2019/01/16 Python
django模型动态修改参数,增加 filter 字段的方式
2020/03/16 Python
新闻专业应届生求职信
2013/10/31 职场文书
文明学生标兵事迹
2014/01/21 职场文书
同事打架检讨书
2014/02/04 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
优秀安全员事迹材料
2014/05/11 职场文书
小学优秀辅导员事迹材料
2014/05/11 职场文书
机关搬迁方案
2014/05/18 职场文书
电子专业自荐信
2014/07/01 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
手机被没收的检讨书
2014/10/04 职场文书
2014年工商所工作总结
2014/12/09 职场文书
2014年教研员工作总结
2014/12/23 职场文书
七年级数学教学反思
2016/02/17 职场文书
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android
为Centos安装指定版本的Docker
2022/04/01 Servers
分享几个实用的CSS代码块
2022/06/10 HTML / CSS