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使用urllib2获取网络资源实例讲解
Dec 02 Python
整理Python 常用string函数(收藏)
May 30 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
Jan 23 Python
python中ASCII码字符与int之间的转换方法
Jul 09 Python
使用Python实现企业微信的自动打卡功能
Apr 30 Python
Python批量生成幻影坦克图片实例代码
Jun 04 Python
pygame实现俄罗斯方块游戏(AI篇2)
Oct 29 Python
python实现人像动漫化的示例代码
May 17 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
python 自动刷新网页的两种方法
Apr 20 Python
如何在向量化NumPy数组上进行移动窗口
May 18 Python
python 字典和列表嵌套用法详解
Jun 29 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
php设计模式之命令模式使用示例
2014/03/02 PHP
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
jQuery中调用WebService方法小结
2011/03/28 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
2015/12/08 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
jQuery实现获取h1-h6标题元素值的方法
2017/03/06 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
vue axios登录请求拦截器
2018/04/02 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
布同 统计英文单词的个数的python代码
2011/03/13 Python
python实现定时提取实时日志程序
2018/06/22 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
python3实现将json对象存入Redis以及数据的导入导出
2020/07/16 Python
python绘制分布折线图的示例
2020/09/24 Python
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
工作态度检讨书
2014/02/11 职场文书
入党自我鉴定
2014/03/25 职场文书
《孔繁森》教学反思
2014/04/17 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
老公婚前保证书
2015/02/28 职场文书
护士医德考评自我评价
2015/03/03 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
Python极值整数的边界探讨分析
2021/09/15 Python
Spring中的@Transactional的工作原理
2022/06/05 Java/Android