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中for循环和while循环的基本使用方法
Aug 21 Python
深入解析Python中的lambda表达式的用法
Aug 28 Python
解决Python 遍历字典时删除元素报异常的问题
Sep 11 Python
Python 使用requests模块发送GET和POST请求的实现代码
Sep 21 Python
Python OpenCV处理图像之图像像素点操作
Jul 10 Python
解决Pycharm下面出现No R interpreter defined的问题
Oct 29 Python
python导入不同目录下的自定义模块过程解析
Nov 18 Python
python plotly画柱状图代码实例
Dec 13 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
Mar 30 Python
python 基于wx实现音乐播放
Nov 24 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 25 Python
Python内置的数据类型及使用方法
Apr 13 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 URL参数获取方式的四种例子
2014/02/28 PHP
thinkphp连贯操作实例分析
2014/11/22 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
彻底搞懂PHP 变量结构体
2017/10/11 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
几个javascript操作word的参考代码
2009/10/26 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
深入理解js数组的sort排序
2016/05/28 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
Javascript读取上传文件内容/类型/字节数
2019/04/30 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
Python中的类学习笔记
2014/09/23 Python
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
施华洛世奇天猫官方旗舰店:SWAROVSKI
2017/04/17 全球购物
《我不是最弱小的》教学反思
2014/02/23 职场文书
教师个人自我评价范文
2014/04/13 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
校长四风对照检查材料
2014/09/27 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
MySQL 全文检索的使用示例
2021/06/07 MySQL
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang
python数字图像处理之图像的批量处理
2022/06/28 Python