Python中的global关键字,你了解吗?

共 1514字,需浏览 4分钟

 ·

2020-02-05 23:21

咪哥杂谈


ef6eea9b93367bf1ae757af858c0db5e.webp

本篇阅读时间约为 6 分钟。


1

前言


相信经历过这个春节的90后们,都会记忆深刻。就像网上看到的段子一样,给你一台电脑,给你吃喝,让你不出门,你能待多久?

985b198a1d635e639133d3c7fd3ecbb4.webp


疫情开始的时候,年轻人重视,家长不重视,现在反而反过来了,每天过多的疫情信息反而倒不让我那么关注了。
现在到了收心的时候了,面对这样的“黑天鹅事件”,我们应该更多的把注意力放在提升于自身上,而非疫情资讯。
那么废话不多说,今天来了解下 Python 中的 global 关键字。

2

Python变量的作用域


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

曾经在闭包的文章 《python小课堂26 - 进阶必修之闭包(一)》中,我写过一段关于作用域的介绍,复制下:
Python变量的作用域一共有4种,分别是:
  • L (Local) 局部作用域
  • E (Enclosing) 闭包函数外的函数中
  • G (Global) 全局作用域
  • B (Built-in) 内建作用域
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
看完概念,接下来看看实例,
请自行思考后再看答案

bcb13e1d4cbc98b8ac0b0e558136d7cf.webp

672f6c79033ee2d25f0f62bb719901f0.webp

78ed8ab706f079b4bf17b97dd4252a21.webp

4144d64a59cafb0a44036c2f7badc448.webp

结论:
实例一:

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


实例二 & 实例三:

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


实例四:

引用全局变量。

3

global关键字


先来解释下,Global 中文含义:全球的,全面的。
global warming:全球变暖。39d755fb2388edab11e5323eadd0b22e.webp
上面的作用域四个案例如果看明白了,那我们继续。

如果现在有个问题是这样的:
有个变量 x=5 ,现需要让多个函数共享并且在函数内引用它,请用代码实现下。
有的小伙伴可能已经想到,这题的答案不就是上面的实例四吗?
在 func_a 和 func_b 函数中,你们看到外面的 x = 5 已经作为全局变量在这两个函数中分别成功打印。
4144d64a59cafb0a44036c2f7badc448.webp
对于全局变量来说,既然能函数体内直接引用,并且程序没有报错,那为什么还要用 global 关键字?
别急,继续往下看。
现在在重新声明一个 func_c 函数,并且对这个 x 进行加 1 的操作。你觉得会打印什么结果?

7de42396fc1e395db4693e9ffcb30cf5.webp

可以看到已经报错了 ,UnboundLocalError,错误代码第 9 行 x = x+1。
在这个例子中设置的 x=5 属于全局变量,而在函数内部中没有对 x 的定义。
根据 Python 访问局部变量和全局变量的规则:当搜索一个变量的时候,Python 先从局部作用域开始搜索,如果在局部作用域没有找到那个变量,那样 Python 就会像上面的案例中介绍的作用域范围逐层寻找。
最终在全局变量中找这个变量,如果找不到则抛出  UnboundLocalError 异常。
但你会想,明明已经在全局变量中找到同名变量了,怎么还是报错?
因为内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改的时候,此时 Python 会认为它是一个局部变量,而函数中并没有 x 的定义和赋值,所以报错。





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

f5419d301181e41c958ecdd1721504fe.webp

4

结语


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


13758ac0f917b5d293006ab0f5bec47b.webp


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




▼往期精彩回顾▼网易云音乐源码分享新手必会,python中的debug调试一份王者荣耀的英雄数据报告



e79ad9f62f7cd51da633f3fd08d1ee12.webp你点的每个在看,我都认真当成了喜欢


浏览 14
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报