参考链接: Python全局关键字

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xCyansun/article/details/79672634

终于下定决心学习Python了。既然从头开始,就需要认认真真。

首先需要说的是,我是初学Python,这篇文章只是用于展示global和nonlocal关键字的区别,是很简单的知识点,如果你已经学过,可以绕道。因为不经常写博客,而且是个Python小白,所以内容有些啰嗦。。。

注意:我使用的是Python3.6.3,可能和Python2有不同的地方,并未确认。

考虑到文章比较啰嗦,先把结论贴出来,避免浪费大家的时间:

第一,两者的功能不同。global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。

第二,两者使用的范围不同。global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用,而nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误(见第一)。

接下来是得到结论的过程,有兴趣的可以浏览一下。

我们先来看一个代码片段,看看默认情况下输出结果是什么(不敢恭维CSDN显示代码的格式,这里使用图片,如果要验证,得麻烦各位动动指头了)。

输出结果:

上面的代码片段中没有使用global或nonlocal关键字,是为了看一下默认情况下的输出结果。

可以看到变量x在三次输出中是同一个变量(值相同,地址也相同),都是全局变量,在print函数中使用三个参数是为了方便识别变量,第一个参数是print运行的位置,第二个参数是变量x保存的值,第三个参数是变量x保存的值的地址(这个有待考证)。

如果我们在func函数中修改x的值呢?

输出结果:

可以看到func函数中x的值和地址都变了,但没有影响函数外边的x的值和地址(main1和main2的数据相同)。所以func函数内的x变量和函数外的x变量是两个变量,而func内的x变量是局部变量,修改它的值不影响全局变量。

第一回合:在函数内部使用了与全局变量同名的变量,如果不对该变量赋值(修改变量),那么该变量就是全局变量,如果对该变量进行赋值,那么该变量就是局部变量。

如果我们想在func函数内修改全局变量x呢?我们先试试用global(全局)。

运行后报错,提示语法错误。原来global修饰变量时不能直接赋值,修改为如下:

运行结果:

可以看到main1位置的x和func内部func1位置的x是同一个值,但和func内部的func2以及main2位置的x不一样了,反而是main2处的x和func内部的x变量是同一个。

第二回合:global关键字修饰函数内部变量后标志其是全局变量(这里不能说global将x从局部变量改为了全局变量),如果用global修饰函数内的变量,必须在使用该变量前进行修饰(否则会发生变量未定义的错误,请你自己尝试一下)。

我们试试nonlocal关键字呢?

报错了,无法使用nonlocal关键字。

接下来我们看看怎样使用nonlocal关键字。

我们先添加一个嵌套函数:

输出结果:

可以看到嵌套函数内默认使用的也是全局变量。我们在func函数中修改一下x的值试试。

输出结果:

可以看到在func函数中修改x后,x被标识成局部变量,它的改变并没有影响全局变量x,但嵌套函数ifunc中的x受到了影响,显示ifunc中的x是func函数中的局部变量。

我们再继续修改一下ifunc中x的值。

输出结果:

可以看到在ifunc修改x的之后即没有影响func中的局部变量x,也没有影响全局变量x,ifunc中的x是函数ifunc自己的局部变量。

第三回合:如果在嵌套函数和函数(这里指包含嵌套函数的那个函数)中存在和全局变量同名的变量,如果直接使用,而不修改变量的值,那么这三个位置的变量使用的是同一个全局变量,如果在函数中修改了变量值,那么该变量会被标识为该函数的局部变量,嵌套函数直接使用时使用的是该函数的局部变量。如果在嵌套函数中修改同名变量的值,那么嵌套函数中的该变量会被标识为该嵌套函数的局部变量,它的修改不影响函数中同名变量和全局变量。

我们在嵌套函数中添加global关键字试试。

先不修改ifunc中x的值:

输出结果:

可以看出嵌套函数ifunc中的x是全局变量。

再修改一下ifunc中x的值试试:

输出结果:

可以看出嵌套函数中x是全局变量,但它的修改没有影响到func函数中的同名局部变量。

我们在前边已经发现在func函数中直接使用nonlocal关键字发生了报错,我们再试试在ifunc中使用nonlocal关键字:

输出结果:

可以看到nonlocal修饰后,ifunc中的x和func中的x是同一个变量,ifunc中修改x的值影响了func中的x(因为是一个变量),但并没有影响全局变量x。

再扩展一下:

在func函数中用global修饰x并修改ifunc中x的值,看看有什么变化:

输出结果:

我们再用nonlocal修饰一下ifunc函数中的x:

运行时发生报错,提示没有为ifunc中的x找到绑定。

第四回合:global可以在任何地方修饰变量,而且被global修饰的变量直接被标识为全局变量,对该变量修改会影响全局变量的值,但不影响函数中未被global修饰的同名变量(依然是局部变量),nonlocal只能在嵌套函数(可能还有其他的地方,我还没有检查)中使用,用于标识嵌套函数中的变量是包含该嵌套函数的函数中的同名变量,在嵌套函数中修改变量会影响函数中的变量。如果在函数中使用global修饰了变量,那么在嵌套函数中用nonlocal修饰同名变量会发生报错,因为nonlocal表示该变量在函数中已经定义,但检查时因为同名变量被global修饰为全局变量,所以不存在同名的局部变量,从而导致错误。

如果文章中的内容存在错误,请大家指出来,如果你有更好的建议或意见,还请不吝赐教。谢谢。

---------------------

作者:雁丘1990

来源:CSDN

原文:https://blog.csdn.net/xcyansun/article/details/79672634

版权声明:本文为博主原创文章,转载请附上博文链接!

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

  1. python nonlocal的用法_python中的global和nonlocal关键字怎么使用

    global 和 nonlocal关键字 当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了. 以下实例修改全局变量 num: #!/usr/bin/python3 ...

  2. python中nonlocal是什么意思_Python中的global和nonlocal

    在Python中,一个变量的scope范围从小到大分成4部分:Local Scope(也可以看成是当前函数形成的scope),Enclosing Scope(简单来说,就是外层函数形成的scope), ...

  3. [转载] python里字典的用法_python中字典(Dictionary)用法实例详解

    参考链接: Python字典dictionary copy方法 本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映 ...

  4. [转载] python staticmethod有什么意义_Python 中的 classmethod 和 staticmethod 有什么具体用途

    参考链接: Python staticmethod() >>> type(a1) example 2: class a(object): @classmethod def cm(cl ...

  5. python访问属性的格式_Python 中几种属性访问的区别

    图 | <借东西的小人阿莉埃蒂>剧照 起步 python的提供一系列和属性访问有关的特殊方法:__get__, __getattr__, __getattribute__, __getit ...

  6. python sys模块详解_python中os和sys模块的区别与常用方法总结

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

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

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

  8. nonlocal python3_Python 中的 global、nonlocal 辨析

    global 语句 语法:声明此变量为全局变量 用法: global [变量名] 注意:引用全局变量时,不需要global 声明,但是后面使用或者修改这个全局变量的时候,需要global声明. 应用场 ...

  9. python中的global是什么意思_Python中的global关键字,你了解吗?

    前言 今天来了解下 Python 中的 global 关键字. Python变量的作用域 实战案例演示之前,先要了解下 Python 的作用域. 曾经在闭包的文章 <python小课堂26 - ...

最新文章

  1. 【青少年编程】【三级】猜数字
  2. 《Nature》:衰老后的核糖体发生了哪些致病变化
  3. 计算机视觉领域的一些牛人博客,研究机构等的网站链接
  4. springboot-springSecurity 之 http Basic认证 (四)
  5. Dubbo生产者消费者配置
  6. 从0搭建一个Springboot+vue前后端分离项目(八)把数据从后台传到前端进行展示渲染,完善增删改查
  7. python多线程爬取斗图啦数据
  8. AutowireCapableBeanFactory接口
  9. 在windows XP下如何用Vmware装Linux操作系统
  10. 剑指Offer面试题:28.连续子数组的最大和
  11. 实时渲染器不止lumion,Chaos Vantage你值得一试
  12. python自定义二元一次函数_Python二元赋值实用技巧解析
  13. 搜索实现vue+Element-ui仿商城搜索
  14. 关于微信小程序web开发者工具模拟器出现空白问题
  15. Matlab GUI的数据传递——运用GUI本身的varargin和varargout传递参数
  16. 电子计算机可直接,电子计算机可直接执行的指令在机器内部是以什么表示的
  17. <<计算机视觉CVPR>>2022:Grounded Language-Image Pre-training
  18. 报错 | Error: EPERM: operation not permitted, unlink ‘C:\Users\Admin\practice\node_modules\css-loader
  19. python中dot函数_np.dot()函数的用法详解
  20. 针对Android平台播放器开源库NiceVieoPlayer倍速的开发

热门文章

  1. 【云计算】阿里云云计算架构师ACE成长路线v2
  2. 【POJ3784】Running Median(中位数,对顶堆)
  3. 动态调试 ida linux,IDA动态调试-ELF
  4. MySQL不应出现的开始声明_备考:2019年9月计算机二级MySQL试题
  5. JavaScript入门→HTML引用JS、变量、表达式操作符、数组Array数组对象、选择结构循环结构、函数、JavaScript与JAVA区别
  6. .axf文件_ELF文件格式与readelf命令使用
  7. JavaScript文档对象模型document对象获取自定义属性值和设置移除自定义属性(5)
  8. java 对象的强制类型转换
  9. 学生信息管理系统(c++源代码实现)
  10. Wannafly挑战赛22: C. 多项式(大整数)