Python手记:global 和 nonlocal的区别
文章目录
- 序
- 一、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的区别相关推荐
- python中global和nonlocal用法的详细说明
1.前言 第一,两者的功能不同.global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数 ...
- Python关键字 global与nonlocal
Python关键字 global与nonlocal global def test():#1函数内如果没定义x,则x默认为全局变量print(x) # 输出 global v#2函数内如果定义x,则x ...
- [转载] python不允许使用关键字_Python中关键字global与nonlocal的区别
参考链接: Python全局关键字 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xCyansun/article/details/79672634 ...
- Python中关键字global与nonlocal的区别
终于下定决心学习Python了.既然从头开始,就需要认认真真. 首先需要说的是,我是初学Python,这篇文章只是用于展示global和nonlocal关键字的区别,是很简单的知识点,如果你已经学过, ...
- python中global 和 nonlocal 的作用域
python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 . global 一.在局部如果声明全局变量,可以对全局变量修改, ...
- Python 关键字 global、nonlocal、yield用法
1. global global 关键字用于表示某个变量是属于全局的,而不是局部变量.先看个例子: In [82]: x = 10In [83]: def func():...: x += 1...: ...
- python global和nonlocal_python global和nonlocal用法解析
python global和nonlocal用法解析 这篇文章主要介绍了python global和nonlocal用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值 ...
- python中global和def_Python中 Global和Nonlocal的用法详解
nonlocal 和 global 也很容易混淆.简单记录下自己的理解. 解释 global 总之一句话,作用域是全局的,就是会修改这个变量对应地址的值. global 语句是一个声明,它适用于整个当 ...
- python函数教程:global 和 nonlocal的详细用法
global 方法 我们来看下面这段代码: b = 100 def func():b = b + 1return b print(func()) 这段代码看上去中规中矩,似乎没有什么问题,但是程序运行 ...
最新文章
- Spring Cloud(五)断路器监控(Hystrix Dashboard)
- python input与返回值-Python 详解基本语法_函数_返回值
- OVS DPDK--网桥配置(四)
- 一致吗 驱动_外国不过春节?AMD驱动再更新,解决BUG,游戏不闪退,重启不黑屏...
- 三菱880彩铅和uni的区别_彩铅测评|150色荷尔拜因彩铅初体验
- 自己的数字选择控件NumberPicker
- 服务器节点信息管理,华为云管理节点服务器
- 一定要多读多记FreeEIM
- 吴恩达深度学习 —— 2.15 python中的广播
- 和dump文件什么区别_将java进程转移到“解剖台”之前,法医都干了什么?
- Java基础学习总结(86)——Java异常处理机制Exception抛出异常时throw和throws用法详解
- binder 从c到java_Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析...
- 证券交易1-交易系统简介
- C#——已知两点及半径,求圆心坐标
- 接待员如何向客人upsell_酒店前厅部概述-.ppt
- TcaplusDB X 光与夜之恋|春暖花开之际与你相遇
- rational rose 启动选择_Rational Rose 附使用教程
- SEVERE: Could not contact [localhost:8005] (base port [8005] and offset [0]). Tomcat may not be runn
- Blender:Lowpoly手部建模流程(附blender源文件下载)
- 对于自我的反省 - 对底层人民认知产生的商业思考