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中列表(list)操作方法汇总
Aug 18 Python
跟老齐学Python之使用Python操作数据库(1)
Nov 25 Python
Python浅拷贝与深拷贝用法实例
May 09 Python
讲解Python中if语句的嵌套用法
May 14 Python
python登录豆瓣并发帖的方法
Jul 08 Python
Python3如何解决字符编码问题详解
Apr 23 Python
python清除字符串前后空格函数的方法
Oct 21 Python
Python通过paramiko远程下载Linux服务器上的文件实例
Dec 27 Python
python区分不同数据类型的方法
Oct 14 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 Python
总结python 三种常见的内存泄漏场景
Nov 20 Python
Python hashlib和hmac模块使用方法解析
Dec 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 - Html Transfer Code
2006/10/09 PHP
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
Parse正式发布开源PHP SDK
2014/08/11 PHP
php采用ajax数据提交post与post常见方法总结
2014/11/10 PHP
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
jQuery选择器中含有空格的使用示例及注意事项
2013/08/25 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
[03:43]2014DOTA2西雅图国际邀请赛 newbee战队巡礼
2014/07/07 DOTA
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
python字符串查找函数的用法详解
2019/07/08 Python
python如何保证输入键入数字的方法
2019/08/23 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
吃空饷专项治理工作实施方案
2014/03/04 职场文书
优秀的2014年两会精神解读
2014/03/17 职场文书
中华魂放飞梦想演讲稿
2014/08/26 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
慰问信格式
2015/02/14 职场文书
教师党员自我评价2015
2015/03/04 职场文书
幼儿园教师个人工作总结2015
2015/05/12 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书
农村婚礼司仪主持词
2015/06/29 职场文书
个人工作总结怎么写?
2019/04/09 职场文书
小程序wx.getUserProfile接口的具体使用
2021/06/02 Javascript