Python中 Global和Nonlocal的用法详解


Posted in Python onJanuary 20, 2020

nonlocal 和 global 也很容易混淆。简单记录下自己的理解。

解释

global

总之一句话,作用域是全局的,就是会修改这个变量对应地址的值。

global 语句是一个声明,它适用于整个当前代码块。 这意味着列出的标识符将被解释为全局变量。 尽管自由变量可能指的是全局变量而不被声明为全局变量。

global 语句中列出的名称不得用于该全局语句之前的文本代码块中。

global 语句中列出的名称不能定义为形式参数,也不能在 for 循环控制目标、 class 定义、函数定义、 import 语句或变量注释中定义。

当前的实现并不强制执行这些限制,但是程序不应该滥用这种自由,因为未来的实现可能会强制执行这些限制,或者悄悄地改变程序的含义。

程序员注意: global 是指向解析器的指令。 它仅适用于与全局语句同时解析的代码。 特别是,包含在提供给内置 exec() 函数的字符串或代码对象中的全局语句不会影响包含函数调用的代码块,而且这种字符串中包含的代码不会受包含函数调用的代码中的全局语句的影响。 eval() 和 compile() 函数也是如此。

Python中 Global和Nonlocal的用法详解

一、global

1、global关键字用来在函数或其他局部作用域中使用全局变量。但是如果不修改全局变量也可以不使用global关键字。

gcount = 0
def global_test():
  gcount+=1
  print (gcount)
global_test()

以上代码会报错:第一行定义了全局变量,在内部函数中又对外部函数进行了引用并修改,那么python会认为它是一个局部变量,有因为内部函数没有对其gcount进行定义和赋值,所以报错。

2、如果局部要对全局变量修改,则在局部声明该全局变量

gcount = 0
def global_test():
  global gcount
  gcount+=1
  print (gcount)
global_test()

以上输出为:1

3、如果局部不声明全局变量,并且不修改全局变量,则可以正常使用

gcount = 0
def global_test():
  print (gcount)
global_test()

以上输出为:0

 二、nonlocal

 nonlocal

只在闭包里面生效,作用域就是闭包里面的,外函数和内函数都影响,但是闭包外面不影响。

nonlocal 语句使列出的标识符引用除 global 变量外最近的封闭范围中的以前绑定的变量。 这很重要,因为绑定的默认行为是首先搜索本地名称空间。 该语句允许封装的代码将变量重新绑定到除全局(模块)作用域之外的本地作用域之外。

nonlocal 语句中列出的名称与 global 语句中列出的名称不同,它们必须引用封闭范围中已经存在的绑定(无法明确确定应在其中创建新绑定的范围)。

1、 nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量

def make_counter():
  count = 0
  def counter():
    nonlocal count
    count += 1
    return count
  return counter   
def make_counter_test():
 mc = make_counter()
 print(mc())
 print(mc())
 print(mc())
make_counter_test()

以上输出为:

1

2

3

三、混合使用

def scope_test():
  def do_local():
    spam = "local spam" #此函数定义了另外的一个spam字符串变量,并且生命周期只在此函数内。此处的spam和外层的spam是两个变量,如果写出spam = spam + “local spam” 会报错
  def do_nonlocal():
    nonlocal spam    #使用外层的spam变量
    spam = "nonlocal spam"
  def do_global():
    global spam
    spam = "global spam"
  spam = "test spam"
  do_local()
  print("After local assignmane:", spam)
  do_nonlocal()
  print("After nonlocal assignment:",spam)
  do_global()
  print("After global assignment:",spam)
 
scope_test()
print("In global scope:",spam)

以上输出为:

After local assignmane: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam

总结

以上所述是小编给大家介绍的Python中 Global和Nonlocal的用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python通过字典dict判断指定键值是否存在的方法
Mar 21 Python
Python字符串和文件操作常用函数分析
Apr 08 Python
python处理html转义字符的方法详解
Jul 01 Python
详解python的argpare和click模块小结
Mar 31 Python
Django MEDIA的配置及用法详解
Jul 25 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 Python
python 匿名函数与三元运算学习笔记
Oct 23 Python
如何用python写个模板引擎
Jan 14 Python
Python爬虫自动化爬取b站实时弹幕实例方法
Jan 26 Python
Pycharm 设置默认解释器路径和编码格式的操作
Feb 05 Python
PyCharm常用配置和常用插件(小结)
Feb 06 Python
PyTorch中permute的使用方法
Apr 26 Python
Django后台管理系统的图文使用教学
Jan 20 #Python
解决Pycharm的项目目录突然消失的问题
Jan 20 #Python
Python log模块logging记录打印用法解析
Jan 20 #Python
解决tensorflow训练时内存持续增加并占满的问题
Jan 19 #Python
Tensorflow获取张量Tensor的具体维数实例
Jan 19 #Python
tensorflow 重置/清除计算图的实现
Jan 19 #Python
TensorFlow2.0:张量的合并与分割实例
Jan 19 #Python
You might like
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
ExtJs之带图片的下拉列表框插件
2010/03/04 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
2019/02/22 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
2019/11/20 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
[01:07:34]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第二场 1月9日
2021/03/11 DOTA
详解Python中的type()方法的使用
2015/05/21 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
python采集微信公众号文章
2018/12/20 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
python代码如何实现余弦相似性计算
2020/02/09 Python
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
俄罗斯护发和专业化妆品购物网站:Hihair
2019/09/28 全球购物
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
优质服务活动实施方案
2014/05/02 职场文书
竞聘上岗演讲
2014/05/19 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
幼儿园六一主持词
2015/06/30 职场文书
开学第一周总结
2015/07/16 职场文书
聘任通知书
2015/09/21 职场文书