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入门篇之面向对象
Oct 20 Python
Python中的字符串类型基本知识学习教程
Feb 04 Python
实例讲解Python的函数闭包使用中应注意的问题
Jun 20 Python
python 数据的清理行为实例详解
Jul 12 Python
python Socket之客户端和服务端握手详解
Sep 18 Python
python出现"IndentationError: unexpected indent"错误解决办法
Oct 15 Python
Python编程之黑板上排列组合,你舍得解开吗
Oct 30 Python
Python中Proxypool库的安装与配置
Oct 19 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
Aug 30 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 Python
python实现经纬度采样的示例代码
Dec 10 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
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
php面向对象编程self和static的区别
2016/05/08 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
2017/03/15 PHP
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
2013/12/16 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
javascript实现九宫格相加数值相等
2020/05/28 Javascript
JavaScript中的prototype原型学习指南
2016/05/09 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
2016/06/13 Javascript
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
Ubuntu下创建虚拟独立的Python环境全过程
2017/02/10 Python
Python Socket使用实例
2017/12/18 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
Python虚拟环境的原理及使用详解
2019/07/02 Python
python障碍式期权定价公式
2019/07/19 Python
python爬虫刷访问量 2019 7月
2019/08/01 Python
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
医学院毕业生自荐信
2013/11/08 职场文书
最新自我评价范文
2013/11/16 职场文书
2014自荐信的写作技巧
2014/01/28 职场文书
幼儿园个人师德总结
2015/02/06 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
2015年街道除四害工作总结
2015/05/15 职场文书
Nginx的rewrite模块详解
2021/03/31 Servers
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python
Java字符串逆序方法详情
2022/03/21 Java/Android
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers
详解MySQL的内连接和外连接
2023/05/08 MySQL