首页 > 编程 > Python > 正文

Python进阶_关于命名空间与作用域(详解)

2020-02-16 01:36:51
字体:
来源:转载
供稿:网友

写在前面

如非特别说明,下文均基于Python3

命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字、对象及其绑定的文章。

1. 命名空间

1.1 什么是命名空间

Namespace命名空间,也称名字空间,是从名字到对象的映射。Python中,大部分的命名空间都是由字典来实现的,但是本文的不会涉及命名空间的实现。命名空间的一大作用是避免名字冲突:

def fun1():  i = 1def fun2():  i = 2

同一个模块中的两个函数中,两个同名名字i之间绝没有任何关系,因为它们分属于不同明明空间。

1.2 命名空间的种类

常见的命名空间有:

built-in名字集合,包括像abs()这样的函数,以及内置的异常名字等。通常,使用内置这个词表示这个命名空间-内置命名空间

模块全局名字集合,直接定义在模块中的名字,如类,函数,导入的其他模块等。通常,使用全局命名空间表示。

函数调用过程中的名字集合,函数中的参数,函数体定义的名字等,在函数调用时被“激活”,构成了一个命名空间。通常,使用局部命名空间表示。

一个对象的属性集合,也构成了一个命名空间。但通常使用objname.attrname的间接方式访问属性,而不是直接访问,故不将其列入命名空间讨论。

类定义的命名空间,通常解释器进入类定义时,即执行到class ClassName:语句,会新建一个命名空间。(见官方对类定义的说明)

1.3 命名空间的生命周期

不同类型的命名空间有不同的生命周期:

内置命名空间,在Python解释器启动时创建,解释器退出时销毁;

全局命名空间,模块的全局命名空间在模块定义被解释器读入时创建,解释器退出时销毁;

局部命名空间,这里要区分函数以及类定义。函数的局部命名空间,在函数调用时创建,函数返回或者由未捕获的异常时销毁;类定义的命名空间,在解释器读到类定义创建,类定义结束后销毁。(关于类定义的命名空间,在类定义结束后销毁,但其实类对象就是这个命名空间内容的包装,见官方对类定义的说明)

2. 作用域

2.1 什么是作用域

作用域是Python的一块文本区域,这个区域中,命名空间可以被“直接访问”。这里的直接访问指的是试图在命名空间中找到名字的绝对引用(非限定引用)。这里有必要解释下直接引用和间接引用:

直接引用;直接使用名字访问的方式,如name,这种方式尝试在名字空间中搜索名字name。

间接引用;使用形如objname.attrname的方式,即属性引用,这种方式不会在命名空间中搜索名字attrname,而是搜索名字objname,再访问其属性。

2.2 与命名空间的关系

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表