首页 > 编程语言 >Python 中global 关键字理解

Python 中global 关键字理解

时间:2023-02-01 14:33:05浏览次数:41  
标签:函数 Python 作用域 global 关键字 全局变量 变量

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

前言

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

Python变量的作用域

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

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

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

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


 

 

结论:

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

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

实例四: 引用全局变量。

global关键字

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

global warming:全球变暖。

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

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

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

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

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

 

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

别急,继续往下看。

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

 

 

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

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

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

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

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

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


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

 

 

结语

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

标签:函数,Python,作用域,global,关键字,全局变量,变量
From: https://www.cnblogs.com/FireLife-Cheng/p/17082491.html

相关文章

  • python 中给文件加锁——fcntl模块
    如果没有fcntl模块则用sudopipinstallfcntl安装模块简单说明:打开文件,不存在则创建之f=open('./test','w')fcntl.flock(f,fcntl.LOCK_EX)这样就对文件t......
  • python实现区块链代码
    如果你明白了原理其实挺简单的。加密算法是python自带的需要导入hashlibimporthashlibashashsha=hasher.sha256()sha.update('yourcontent')printsha.hexdigest()输......
  • Python-接口
    fromabcimportABCMeta,abstractmethod#接口:若干抽象方法的集合classPaymet(metaclass=ABCMeta):#abstractmethodclass#抽象方法@abstractmeth......
  • Python中报“TypeError: 'int' object is not callable”错误的解决办法
    当时就想用sum()函数求和发现之前 “sum” 这个关键字被当变量名定义过了,然后我试着把自己自定义的变量都给删除了,删除之后再次试了一下,发现可以了,果然是sum()函数被之......
  • 三行Python代码,让你的数据处理脚本快别人4倍
    Python是一门非常适合处理数据和自动化完成重复性工作的编程语言,我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Python就非常适合完成这项工作,比如需要重新......
  • Python迭代器,生成器,装饰器
    迭代器通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值)。可迭代对象(iterable......
  • python生成随机数、随机字符串
    importrandomimportstring#随机整数:printrandom.randint(1,50)#随机选取0到100间的偶数:printrandom.randrange(0,101,2)#随机浮点数:printrandom.random()printra......
  • 并发编程-Python
    目录01、理论多道技术null02、进程进程运行的三状态图同步和异步阻塞和非阻塞开启进程的两种方式进程对象的join方法进程之间数据相互隔离(默认情况下)进程对象及其他方法僵......
  • python 大图找小图
    frompathlibimportPathimportnumpyimportcv2classImage:def__init__(self,image):self.image=cv2.imread(image,cv2.IMREAD_UNCHANGED)@propert......
  • python pyqt5简单界面
    ​​https://doc.qt.io/qtforpython/PySide6/QtWidgets/QTableWidget.html​​importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QDesktopWidget,QHBoxLayou......