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实现的一个找零钱的小程序代码分享
Aug 25 Python
Python动态加载模块的3种方法
Nov 22 Python
解析Python中的__getitem__专有方法
Jun 27 Python
python django事务transaction源码分析详解
Mar 17 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
用xpath获取指定标签下的所有text的实例
Jan 02 Python
python定位xpath 节点位置的方法
Aug 27 Python
PyCharm刷新项目(文件)目录的实现
Feb 14 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
Mar 30 Python
Python基于Tkinter编写crc校验工具
May 06 Python
Python Merge函数原理及用法解析
Sep 16 Python
Pandas DataFrame求差集的示例代码
Dec 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删除数组中的特定元素的代码
2012/06/28 PHP
Symfony控制层深入详解
2016/03/17 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
不使用XMLHttpRequest实现异步加载 Iframe和script
2012/10/29 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
2018/08/21 jQuery
vue实现分页组件
2020/06/16 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
JavaScript实现移动端拖动元素
2020/11/24 Javascript
[01:07:46]完美世界DOTA2联赛循环赛 Magma vs IO BO2第二场 11.01
2020/11/02 DOTA
python time模块用法实例详解
2014/09/11 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
Django框架登录加上验证码校验实现验证功能示例
2019/05/23 Python
如何将 awk 脚本移植到 Python
2019/12/09 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
英国最大的运动营养公司之一:LA Muscle
2018/07/02 全球购物
Java程序员综合测试题
2014/04/25 面试题
运动会入场解说词
2014/02/07 职场文书
高中军训感想300字
2014/03/04 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
化验室岗位职责
2015/02/14 职场文书
2019七夕节祝福语36句,快来收藏吧
2019/08/06 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
OpenCV-Python实现轮廓拟合
2021/06/08 Python