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 的 Socket 编程
Mar 24 Python
Python3使用requests发闪存的方法
May 11 Python
深入理解python多进程编程
Jun 12 Python
python爬虫的工作原理
Mar 05 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
Jul 24 Python
python3 flask实现文件上传功能
Mar 20 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
python实现猜拳小游戏
Apr 05 Python
python实现程序重启和系统重启方式
Apr 16 Python
Python+Xlwings 删除Excel的行和列
Dec 19 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 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使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
js 输出内容到新窗口具体实现代码
2013/05/31 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
2013/11/22 Javascript
原始XMLHttpRequest方法详情回顾
2013/11/28 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
javaScript手机号码校验工具类PhoneUtils详解
2017/12/08 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
python中matplotlib的颜色及线条控制的示例
2018/03/16 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
Python常用模块sys,os,time,random功能与用法实例分析
2020/01/07 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
python多进程使用函数封装实例
2020/05/02 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
如何用python写个模板引擎
2021/01/14 Python
css3 border-radius属性详解
2017/07/05 HTML / CSS
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
学生实习自我鉴定
2013/10/11 职场文书
网上签名寄语活动留言
2014/01/18 职场文书
搞笑征婚广告词
2014/03/17 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
小学运动会宣传稿
2015/07/23 职场文书
2016元旦文艺汇演主持词(开场白+结束语)
2015/12/03 职场文书
2021-4-3课程——SQL Server查询【2】
2021/04/05 SQL Server