文章目录

  • 一、Python的定义域
  • 二、global的作用
  • 三、nonlocal的作用
  • 四、闭包
  • 总结

学习过程中,我们会遇到两个有趣的关键字,一个是global,一个是nonlocal。

如果直接对英文进行翻译,一个会被翻译成“全局”,一个被翻译成“非局部”。

无论怎么想,都感觉两个意思差不多。这就很有趣了,就像是在讨论“美”和“不丑”的区别。

其实两个关键字功能都是在划定变量的定义域,需要视场景需要而定。

一、Python的定义域

先试看一个例子:

>>> b = 1
>>> def f():print(b)>>> f()

特别简单,一下就得出了结果。f函数输出了全局变量b的值1。


来看第二个例子:

>>> b = 1
>>> def f():print(b)b = 2>>> f()

与上一个例子相比,f函数中,多了一步对变量b的赋值。那它的结果是什么呢?

首先输出全局变量b的值1,然后对b重新赋值2?

错了:

结果是无法运行,原因是局部变量b未定义。

嘿,这就奇怪了。第一个例子里面我也没有定义局部变量b,怎么它就能去找全局变量b呢?

这就要说到Python的变量作用域规则:假定函数定义体中赋值的变量是局部变量

换而言之啊,因为“b=2”语句的存在,让Python认定f中的b属于局部变量。

二、global的作用

那如何在函数中使用全局变量呢?用global标记一下:

告诉函数,这个变量是个全局变量,接下来的操作都是对全局变量b而言的。

全局的问题解决了,再来看另外一个例子:

>>> def f():count = 0def a():count += 1print(count)return a()>>> f()

猜猜看结果是什么?

有了前面的分析,这个例子就很好得出结果了。依旧是报错嘛。

因为函数a中,对count变量进行了赋值,所以Python认定count是局部变量,但在执行“count + 1”操作时,却没有找到count,所以报错了。

那怎么处理呢?

三、nonlocal的作用

我猜你会用global标记一下,但是注意啊。global标记的是全局变量,而这个例子中的count是a函数上一级f函数的变量,并不是全局变量。


对比global,这里要用 nonlocal标记,告诉a函数,count不在本地定义,但也不在全局变量里。

四、闭包

这个词想必在学习过程中一直听到,它是什么意思呢?简单来说啊,闭包是指延伸了作用域的函数。

我们回头看最后一个例子:

>>> def f():count = 0def a():nonlocal countcount += 1print(count)return a()>>> f()

调用函数f时,f会返回a(),当执行a()的时候,f函数的任务已经完成了,它占用的资源就会释放掉,这其中包括了函数f环境中定义的count变量。

也就是说,在执行a的时候,函数f已经“撒手人寰”了,没有办法再去找到其中的数据。

像函数a中count这一类,不在本地定义域中绑定的变量,我们叫做自由变量。(和线性代数里的自由变量没关系哈。)

用nonlocal标记后呢,Python就会保留自由变量的绑定(或者说定义环境)。

因此最后例子中,整个函数a的作用域是“count = 0”,加上a本身。

因为a延伸了自己的作用域,所以这里就可以被称作“闭包”。

总结

global和nonlocal的功能都是改变变量作用域

global标记全局变量,nonlocal标记非全局、非本地的自由变量

延伸了作用域的函数,被称作“闭包”

Python手记:global 和 nonlocal的区别相关推荐

  1. python中global和nonlocal用法的详细说明

    1.前言 第一,两者的功能不同.global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数 ...

  2. Python关键字 global与nonlocal

    Python关键字 global与nonlocal global def test():#1函数内如果没定义x,则x默认为全局变量print(x) # 输出 global v#2函数内如果定义x,则x ...

  3. [转载] python不允许使用关键字_Python中关键字global与nonlocal的区别

    参考链接: Python全局关键字 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xCyansun/article/details/79672634 ...

  4. Python中关键字global与nonlocal的区别

    终于下定决心学习Python了.既然从头开始,就需要认认真真. 首先需要说的是,我是初学Python,这篇文章只是用于展示global和nonlocal关键字的区别,是很简单的知识点,如果你已经学过, ...

  5. python中global 和 nonlocal 的作用域

    python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 . global 一.在局部如果声明全局变量,可以对全局变量修改, ...

  6. Python 关键字 global、nonlocal、yield用法

    1. global global 关键字用于表示某个变量是属于全局的,而不是局部变量.先看个例子: In [82]: x = 10In [83]: def func():...: x += 1...: ...

  7. python global和nonlocal_python global和nonlocal用法解析

    python global和nonlocal用法解析 这篇文章主要介绍了python global和nonlocal用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值 ...

  8. python中global和def_Python中 Global和Nonlocal的用法详解

    nonlocal 和 global 也很容易混淆.简单记录下自己的理解. 解释 global 总之一句话,作用域是全局的,就是会修改这个变量对应地址的值. global 语句是一个声明,它适用于整个当 ...

  9. python函数教程:global 和 nonlocal的详细用法

    global 方法 我们来看下面这段代码: b = 100 def func():b = b + 1return b print(func()) 这段代码看上去中规中矩,似乎没有什么问题,但是程序运行 ...

最新文章

  1. Spring Cloud(五)断路器监控(Hystrix Dashboard)
  2. python input与返回值-Python 详解基本语法_函数_返回值
  3. OVS DPDK--网桥配置(四)
  4. 一致吗 驱动_外国不过春节?AMD驱动再更新,解决BUG,游戏不闪退,重启不黑屏...
  5. 三菱880彩铅和uni的区别_彩铅测评|150色荷尔拜因彩铅初体验
  6. 自己的数字选择控件NumberPicker
  7. 服务器节点信息管理,华为云管理节点服务器
  8. 一定要多读多记FreeEIM
  9. 吴恩达深度学习 —— 2.15 python中的广播
  10. 和dump文件什么区别_将java进程转移到“解剖台”之前,法医都干了什么?
  11. Java基础学习总结(86)——Java异常处理机制Exception抛出异常时throw和throws用法详解
  12. binder 从c到java_Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析...
  13. 证券交易1-交易系统简介
  14. C#——已知两点及半径,求圆心坐标
  15. 接待员如何向客人upsell_酒店前厅部概述-.ppt
  16. TcaplusDB X 光与夜之恋|春暖花开之际与你相遇
  17. rational rose 启动选择_Rational Rose 附使用教程
  18. SEVERE: Could not contact [localhost:8005] (base port [8005] and offset [0]). Tomcat may not be runn
  19. Blender:Lowpoly手部建模流程(附blender源文件下载)
  20. 对于自我的反省 - 对底层人民认知产生的商业思考

热门文章

  1. Linux运维工程师有“钱途”吗?
  2. 鹅厂一面凉经------也许这就是成长吧!
  3. python实现触摸精灵功能_触摸精灵lua脚本实现微信群自动加好友功能~值得一看...
  4. mysql答题闯关题库
  5. python常用技巧_python 实用的30个小技巧
  6. 【参赛作品38】openGauss/MogDB数据库触发器分两步拆解创建
  7. 闵帆老师论文写作课心得体会——如何写好一篇论文
  8. 不霁何虹 —— 彩虹为什么发生?
  9. 第一章 数据集散地:数据库
  10. 失眠听什么歌有助睡眠,失眠最容易入睡的声音