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 相关文章推荐
Scrapy抓取京东商品、豆瓣电影及代码分享
Nov 23 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
Python实现的读取/更改/写入xml文件操作示例
Aug 30 Python
Django中celery执行任务结果的保存方法
Jul 12 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 Python
python将字母转化为数字实例方法
Oct 04 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
Python datetime 格式化 明天,昨天实例
Mar 02 Python
Python异常原理及异常捕捉实现过程解析
Mar 25 Python
Python Django路径配置实现过程解析
Nov 05 Python
python 实现汉诺塔游戏
Nov 28 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
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
php简单实现MVC
2015/02/05 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
jQuery select控制插件
2009/08/17 Javascript
Mootools 1.2教程 设置和获取样式表属性
2009/09/15 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
jquery实现定时自动轮播特效
2015/12/10 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
Vue 去除路径中的#号
2018/04/19 Javascript
解决JavaScript layui 下拉框不显示的问题
2018/08/14 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
如何在node环境实现“get数据解析”代码实例
2020/07/03 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
Python类属性与实例属性用法分析
2015/05/09 Python
Python实现PS滤镜的旋转模糊功能示例
2018/01/20 Python
python实现图像识别功能
2018/01/29 Python
Python高阶函数、常用内置函数用法实例分析
2019/12/26 Python
浅谈django 重载str 方法
2020/05/19 Python
python 常见的反爬虫策略
2020/09/27 Python
pyqt5实现井字棋的示例代码
2020/12/07 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
毕业求职自荐信格式是什么
2013/11/19 职场文书
革命先烈的英雄事迹材料
2014/02/15 职场文书
2014最新版群众路线四风整改措施
2014/09/24 职场文书
三八节活动简报
2015/07/20 职场文书
Vue实现动态查询规则生成组件
2021/05/27 Vue.js
Python帮你解决手机qq微信内存占用太多问题
2022/02/15 Python
Java的Object类的九种方法
2022/04/13 Java/Android