网络编程
位置:首页>> 网络编程>> Python编程>> Python基础教程之名称空间以及作用域

Python基础教程之名称空间以及作用域

作者:DgLink  发布时间:2022-08-10 07:51:47 

标签:python,作用域,命名空间

前言

所谓“基础不狠,人站不稳”,对于任何一种编程语言来说基础往往都是重中之重,以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

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com