Python基础教程之名称空间以及作用域
作者:DgLink 发布时间:2022-08-10 07:51:47
前言
所谓“基础不狠,人站不稳”,对于任何一种编程语言来说基础往往都是重中之重,以Python为例,其中的两大分水岭就是函数编程和面向对象,而今天所要巩固的知识点后续会多次使用,那就是名称空间和作用域
名称空间
什么是名称空间
在Python中名称空间是用存储对象和名字绑定关系的地方,那么问题来了,什么是对象,什么是名字,什么是绑定关系?
1)在目前,我们对于对象的认知可以暂时只停留在人云亦云的“Python中一切都是对象”基础上,函数是对象、类是对象、变量,模块、所有一切都是对象,有这样的认知就可以了,后续有机会将继续补充;
2)名字,很简单,每一次我们对模块、变量、函数、类的定义都需要取名字,而这些名字都会放在名称空间之中;
3)Python对于名字和数据之间给出了绑定关系,举个例子,当我们在定义a = 6时,Python就自动将变量a这个名字与6这个对象给出了绑定关系,我们可以使用del语句将绑定关系解除。
明白了名称空间是用于存储对象和名字绑定关系的地方,那么接下来就可以细致了解一下名称空间可以分为哪几类了:
1)内置名称空间 —— 用于存放各种内置函数(built-in functions)、内置模块(built-in modules),例如abs()就是内置函数,内置名称空间可以在Python任何一处使用;
2)全局名称空间 —— 全局名称空间中的名字可以在同一个模块中任意处使用;
3)局部名称空间 —— 局部名称空间中的名字仅仅只能够在函数内部使用。
名称空间的意义
名称空间最大的作用就是防止名字重复造成的引用不当,我们可以在全局名称空间中定义一个a = 6同时也可以在局部名称空间中定义一个a = 7,这两者之间是不会产生任何冲突的,这就是名称空间最大的作用,防止名字重复造成的引用不当。
名称空间的查找顺序
知道了名称空间的意义,那么肯定会有读者意识到,我在全局定义一个a = 6,在局部定义一个a = 7,那么接下来调用a这个名字的时候,Python究竟会从哪个空间开始寻找a所对应的对象呢?
我只能说,这位读者你很上道,我们将以实例解答这个问题;
a = 6 # 在全局名称空间中定义一个a
b = 8 # 在全局名称空间中定义一个b,为了测验调用函数时能否找到全局中的b
def test():
a = 7 # 在局部名称空间中定义一个a
return a,b
print(test())
print(a)
(7,8)
6
从以上我们的测验中,调用函数test时输出的a将会是7,而当直接使用print(a)时输出的a将会是6。
所以我们可以大胆的下结论:
1)当调用函数的时候,函数寻找名字的顺序将会是 局部名称空间—>全局名称空间—>内置名称空间;
2)当没有调用函数,直接使用名字的时候查找顺序就是 全局名称空间 —>内置名称空间;
3)只要在某个名称空间(局部也好、全局也罢)中找到了对应的名字,就停止寻找;
4)在不同名称空间中定义相同名字是可行的,后续定义的并不会将原先覆盖掉。
局部名称空间详解
在局部名称空间中有一个非常神奇的事情,因为函数是可以相互嵌套的,在一个函数中嵌套另外一个函数是很正常的现象:
def test_1(): # 定义一个函数
def test_2(): # 在test_1中定义一个嵌套函数
print('球球好心人给个赞吧')
# 这是最简单的函数嵌套,
# 但也是最不规范的函数嵌套,
# 因为如果不改进的话,则无法使用嵌套的test_2函数
来源:https://blog.csdn.net/DgLink/article/details/122390428
猜你喜欢
- 在Python中的break语句终止当前循环,继续执行下一个语句,就像C语言中的break一样。break最常见的用途是当一些外
- python中,我们可以对列表、字符串、元祖中的元素进行排序,那对于字典中的元素可以排序吗?其实对于字典本身我们无法进行排序,但是我们可以对
- 现在只要是有关头像的框基本都是圆形的了,C#提供的PictureBox控键默认情况下是方形的非常大的影响美观PictureBox默认情况下比
- 学完了net/http和fasthttp两个HTTP协议接口的客户端实现,接下来就要开始Server的开发,不学不知道一学吓一跳,居然这两个
- 什么是YOLOV4YOLOV4是YOLOV3的改进版,在YOLOV3的基础上结合了非常多的小Tricks。尽管没有目标检测上革命性的改变,但
- 一、背景 今天闲着无事,写了一个小小的Python脚本程序,然后给同学炫耀的时候,发现每次都得拉着其他人过来看着自己的电脑屏幕,感觉不是很爽
- 因工作需要,最近在学习使用python来解析各种文件,包括xmind,xml,excel,csv等等。在学习python解析XML的时候看到
- 这个问题已经不是什么新鲜问题了,网上也有大把的教程,但大多数是授人以鱼,而不授人以渔,经过辛苦的资料收集,思考,调试,整理,我基本上已经把这
- 前言PyQt是Python语言环境的GUI编程解决方案之一,另外还有PyGTK、wxPython等也较为常用。PyQt作为Qt语言的Pyth
- 一、前言大家在朋友圈应该看到过用一张图片以九宫格的方式显示,效果大致如下:要实现上面的效果非常简单,我们只需要截取图片的九个区域即可。今天我
- 背景:Email地址存于MSSql一用户信息表中,数量上万。公司自有服务器,集SMTP,POP3,WWW,FTP,MSSql,DNS等多种服
- 本文实例为大家分享了python爬取微信公众号文章的具体代码,供大家参考,具体内容如下# -*- coding: utf-8 -*-impo
- 一般不建议做第4,6两步,第4步不安全,有可能损坏数据库或丢失数据。第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复。
- 本人曾经用过的备份方式有:mysqldump、mysqlhotcopy、BACKUP TABLE 、SELECT INTO OUTFILE,
- 1. 前言在SQL开发当中,多表联查是绝对绕不开的一种技能。同样的查询结果不同的写法其运行效率也是千差万别。在实际开发当中,我见过(好像还写
- Tensor.to(device)和model.to(device)的区别区别所在使用GPU训练的时候,需要将Module对象和Tensor
- 前言本文将给大家简单介绍关于区块链(BlockChain)的相关知识,并用Python做一简单实现。下面话不多说,来一起看看详细的介绍:什么
- 最近迁移了wordpress,系统升级为CentOS 6,很奇怪的一个问题,在原来CentOS 5.8下用的很正常的定时备份数据库并通过邮件
- 这是python编写的用于测试网站访问速率的代码片段,可以输出打开某url的时间,访问100次的平均时间,最大时间和最小时间等等import
- 前言这篇博文发布后,有朋友问有没有SQL server版本的,现在有了==》传送门一、场景再现在一个erp进销存系统或0A等其他系统中,如果