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生成随机数的方法
Jan 14 Python
Python中的XML库4Suite Server的介绍
Apr 14 Python
python写入xml文件的方法
May 08 Python
在Python中使用swapCase()方法转换大小写的教程
May 20 Python
python微信公众号之关键词自动回复
Jun 15 Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 Python
python绘制漏斗图步骤详解
Mar 04 Python
Python基础之循环语句用法示例【for、while循环】
Mar 23 Python
python入门之基础语法学习笔记
Feb 08 Python
Python实现自动访问网页的例子
Feb 21 Python
Python 实现一个计时器
Jul 28 Python
如何利用python检测图片是否包含二维码
Oct 15 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/05/02 PHP
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
php获取表单中多个同名input元素的值
2014/03/20 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
Redis在Laravel项目中的应用实例详解
2017/08/11 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
2017/03/21 jQuery
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
python实现每次处理一个字符的三种方法
2014/10/09 Python
Python代码调试的几种方法总结
2015/04/15 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
CSS3实现王者荣耀匹配人员加载页面的方法
2019/04/16 HTML / CSS
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
主要的Ajax框架都有什么
2013/11/14 面试题
大学校务公开实施方案
2014/03/31 职场文书
民事诉讼代理词
2015/05/25 职场文书
2016年小学生新年寄语
2015/08/18 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
九年级化学教学反思
2016/02/22 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
Python初学者必备的文件读写指南
2021/06/23 Python