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