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写的创建文件夹自定义函数mkdir()
Aug 25 Python
Python下线程之间的共享和释放示例
May 04 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
Python数字图像处理之霍夫线变换实现详解
Jan 12 Python
python如何实现int函数的方法示例
Feb 19 Python
基于anaconda下强大的conda命令介绍
Jun 11 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
Nov 29 Python
Python调用scp向服务器上传文件示例
Dec 22 Python
详解Python修复遥感影像条带的两种方式
Feb 23 Python
python中数据库like模糊查询方式
Mar 02 Python
详解Python中第三方库Faker
Sep 25 Python
Pycharm安装Qt Design快捷工具的详细教程
Nov 18 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 中dirname(_file_)讲解
2007/03/18 PHP
PHP计数器的实现代码
2013/06/08 PHP
PHP中的表达式简述
2016/05/29 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
2017/07/04 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
js字符串倒序的实例代码
2018/11/30 Javascript
Vue3.0中的monorepo管理模式的实现
2019/10/14 Javascript
深入理解Javascript中的this关键字
2015/03/27 Python
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
python实现串口自动触发工作的示例
2019/07/02 Python
详解python tcp编程
2020/08/24 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
师范毕业生自我鉴定
2014/01/15 职场文书
运动会开幕式主持词
2014/03/28 职场文书
大学新学期计划书
2014/04/28 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
内勤岗位职责
2015/02/10 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
Redis数据结构之链表与字典的使用
2021/05/11 Redis
oracle连接ODBC sqlserver数据源的详细步骤
2021/07/25 Oracle
Java spring定时任务详解
2021/10/05 Java/Android