前言

今天来了解下 Python 中的 global 关键字。

Python变量的作用域

实战案例演示之前,先要了解下 Python 的作用域。

曾经在闭包的文章 《python小课堂26 - 进阶必修之闭包(一)》中,我写过一段关于作用域的介绍,复制下:

Python变量的作用域一共有4种,分别是:

L (Local) 局部作用域E (Enclosing) 闭包函数外的函数中G (Global) 全局作用域B (Built-in) 内建作用域 以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

看完概念,接下来看看实例,请自行思考后再看答案。

Python中的global关键字,你了解吗?-1.jpg (27.72 KB, 下载次数: 0)

2020-11-11 12:48 上传

Python中的global关键字,你了解吗?-2.jpg (24.67 KB, 下载次数: 0)

2020-11-11 12:48 上传

Python中的global关键字,你了解吗?-3.jpg (28.35 KB, 下载次数: 0)

2020-11-11 12:48 上传

Python中的global关键字,你了解吗?-4.jpg (23.71 KB, 下载次数: 0)

2020-11-11 12:48 上传

结论:

实例一: 即使变量同名,优先引用的是局部变量。

实例二 & 实例三: 闭包的情况,如果内部函数没有局部变量,则会优先引用闭包的环境变量。

实例四: 引用全局变量。

global关键字

先来解释下,Global 中文含义:全球的,全面的。

global warming:全球变暖。

上面的作用域四个案例如果看明白了,那我们继续。

如果现在有个问题是这样的:

有个变量 x=5 ,现需要让多个函数共享并且在函数内引用它,请用代码实现下。

有的小伙伴可能已经想到,这题的答案不就是上面的实例四吗?

在 func_a 和 func_b 函数中,你们看到外面的 x = 5 已经作为全局变量在这两个函数中分别成功打印。

对于全局变量来说,既然能函数体内直接引用,并且程序没有报错,那为什么还要用 global 关键字?

别急,继续往下看。

现在在重新声明一个 func_c 函数,并且对这个 x 进行加 1 的操作。你觉得会打印什么结果?

Python中的global关键字,你了解吗?-6.jpg (43.8 KB, 下载次数: 1)

2020-11-11 12:48 上传

可以看到已经报错了 ,UnboundLocalError,错误代码第 9 行 x = x+1。

在这个例子中设置的 x=5 属于全局变量,而在函数内部中没有对 x 的定义。

根据 Python 访问局部变量和全局变量的规则:当搜索一个变量的时候,Python 先从局部作用域开始搜索,如果在局部作用域没有找到那个变量,那样 Python 就会像上面的案例中介绍的作用域范围逐层寻找。

最终在全局变量中找这个变量,如果找不到则抛出 UnboundLocalError 异常。

但你会想,明明已经在全局变量中找到同名变量了,怎么还是报错?

因为内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改的时候,此时 Python 会认为它是一个局部变量,而函数中并没有 x 的定义和赋值,所以报错。

global 关键字为解决此问题而生,在函数 func_c中,显示地告诉解释器 x 为全局变量,然后会在函数外面寻找 x 的定义,执行完 x = x + 1 后,x 依然是全局变量。

Python中的global关键字,你了解吗?-7.jpg (31.23 KB, 下载次数: 0)

2020-11-11 12:48 上传

结语

好了,这就是本期的内容,关于 global 的相关内容,搞明白作用域,弄清同名变量赋值时的机制,在未来的编程道路中就不会出错啦。

Python中的global关键字,你了解吗?-8.jpg (61.76 KB, 下载次数: 0)

2020-11-11 12:48 上传

如果你有什么想说的,不懂得,欢迎评论区留言!~

python中的global是什么意思_Python中的global关键字,你了解吗?相关推荐

  1. python中字典和集合的区别_Python中字典和集合学习小结

    映射类型: 表示一个任意对象的集合,且可以通过另一个几乎是任意键值的集合进行索引 与序列不同,映射是无序的,通过键进行索引 任何不可变对象都可用作字典的键,如字符串.数字.元组等 包含可变对象的列表. ...

  2. python 函数参数前面两个星号_Python中参数前面一个星号两个星号(*参数,**参数)起什么作用呢?...

    摘要: 下文讲述Python中参数前面一个星号两个星号的功能分享,如下所示: 在Python语言中,我们经常看见参数前面 加上一个星号或两个星号 那么这些写法到底起什么作用呢? 下文将一一道来,如下所 ...

  3. python异常处理时所使用的保留字_Python中,下列哪个保留字不用于异常处理______________。_学小易找答案...

    [单选题]维持细胞生存所必需的最基本的基因是 ( ) [单选题]从体细胞克隆高等哺乳动物的成功说明了 ( ) [单选题]细胞决定与细胞分化的关系是 ( ) [多选题]一种类型的分化细胞转变成另-种类型 ...

  4. python中的列表是指针吗_Python中的指针——到底指什么(二)

    在 Python中的指针--到底指什么(一) 中,我们知道在Python的一切都是对象,变量其实是指向PyObject对象的名称,对不可变变量进行操作后,名称指向了另一个PyObject. 扣留对象 ...

  5. python中遍历字典判断是否存在_python中如何判断值在不在字典中

    python中判断值在不在字典中的方法:我们可以通过for循环来进行判断.在python中for循环可以遍历任何序列的项目.语法结构:[for iterating_var in sequence:st ...

  6. python里删除range里的数字_python中range函数与列表中删除元素

    一.range函数使用 range(1,5)   代表从1到4(不包含5),结果为:1,2,3,4   ,默认步长为1 range(1,5,2)   结果为:1, 3  (同样不包含5) ,步长为2 ...

  7. python语言中print函数的作用_python中如何使用print函数

    Python中print语句 1.逗号分隔符 在Python中print语句可根据sys.stdout中包含的文件生成输出,它接受一个逗号分隔的对象表,如下实例:x = 1 y = 2 z = 3 p ...

  8. python 变量赋值是引用和拷贝_Python 中变量赋值传递时的引用和拷贝

    曾经看到这样一个问题,一个字典中的元素是列表,将这个列表元素赋值给一个变量,然后修改这个列表中元素的值,结果发现,字典中那个列表也同样修改了.那个问题如下: dict = {'a':[1,2,3,4, ...

  9. python中sys模块是什么内容_python中sys模块是做什么用的

    python中的sys是提供了一系列有关python运行环境的变量和函数的模块,如sys.argv函数实现从程序外部向程序传递参数:sys.platform函数用于获取当前系统平台. sys模块提供了 ...

  10. python中转义符的用法大全_Python中的各种转义符\n\r\t

    Python中属性和描述符的简单使用 Python的描述符和属性是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和 ...

最新文章

  1. 关于运行robot framework 报错解决方法,ModuleNotFoundError: No module named 'robot'
  2. java抽象类的构造函数如何定义_我们可以在Java的抽象类中定义参数化的构造函数吗?...
  3. ORA-28056:Writing audit records to Windows Even...
  4. nginx/tengine设置响应头中的cookie属性
  5. MVC RC2中关于HtmlHelper给DropDownList设置初始选中值的问题
  6. linux上验证cudnn是否安装成功_deepin15.7中安装tensorflow+cuda9.0+cudnn7的步骤
  7. 多线程下不能用truncate吗_那么多的化妆品,怀孕后都不能用了吗?
  8. 百度测试新搜索结果页面 改进灵感来自谷歌?
  9. 一步步学敏捷开发:6、Scrum的3种工件
  10. RocketMQ的一些基本概念和RocketMQ特性的讲解
  11. C3P0与DBCP数据库连接池的区别,阿里的Druid数据源配置入门
  12. vue.js--遇到的一些错误
  13. Android中UI线程与后台线程交互设计的5种方法
  14. 【路径规划】基于matlab遗传算法多车辆路径规划【含Matlab源码 704期】
  15. 升讯威周报与工时统计系统 V3
  16. java指定浏览器_java程序中指定某个浏览器打开的实现方法
  17. shopee虾皮跨境电商怎么样,虾皮跨境电商的优势和劣势
  18. Ubuntu 18.04 ibus安装配置中文拼音输入法
  19. 解决 filezilla 连接服务器失败问题
  20. Java程序员必看经典书籍,助你早日打通任督二脉,Java菜鸟教程视频

热门文章

  1. python上市公司_Python批量下载上交所上市公司报告
  2. synergy服务器未响应,请问synergy启动不了怎么回事???
  3. 2019年5G创新深度研究报告
  4. lisp倒入excel数据画图_如何将EXCEL中的数据导入CAD2007画图
  5. 干货 | 双曲空间度量学习在情绪识别中的应用
  6. 计算机、软件专业常去的学习网站
  7. hihoCoder#: 博弈游戏·Nim游戏
  8. 有趣的巴什博弈(Bash Game)
  9. Android 基于Socket的聊天室
  10. python 找对称数