python的命名空间_python 命名空间

本文详细介绍了Python中的命名空间,包括内置、全局和局部命名空间的概念、查询顺序和生命周期。命名空间是一个字典,用于跟踪变量,而作用域决定了变量的可见范围。在查找变量时,Python首先检查局部命名空间,然后是全局命名空间,最后是内置命名空间。当函数或类定义嵌套时,命名空间查询遵循特定的层次。理解这些概念对于编写清晰、无错误的Python代码至关重要。
摘要由CSDN通过智能技术生成

1 命名空间

命名空间(namesapce)用来记录变量的轨迹(记录名字的地方)。命名空间本质上是一个字典(dict),它的键就是变量名,值就是变量的值。A namespace is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries。

在介绍命名空间以前,先了解下python中的缩进

为了让代码看上去更具美感,python舍弃了{},改用缩进来描述流程控制、函数、类等的控制范围。

在python中,有3种命名空间:

内置命名空间:bulitins,python解释器一启动就会有。任何模块均可访问它任何模块均可访问它。如print(),len()。要查看bulitins里 的函数或变量,需要先导入(import)builtins模块,再用dir(builtins)查看。

全局命名空间:每个模块都拥有自己的命名空间,也叫全局命名空间,记录了模块中的变量名,以及对应的值或地址,那些没有缩进,顶头写的,包括变量、函数、类、其它导入的模块、模块级的变量和常量。查看直接调用globals()查看全局命名空间。

局部命名空间:每个函数和类都有着自已的命名空间,叫做局部命名空间每个函数都有着自已的命名空间,叫做局部命名空间。它记录了函数的变量,包括函数的参数和局部定义的变量。或类中定义的局部变量、类中定义的方法。查看局部命名空间,在需要查看的函数或类的控制范围调用locals()。

其中,内置命名空间和全局命名空间是全局作用域,也就是在整个.py文件都生效。局部命名空间是局部作用域,只在定义的函数或类里面有效。

作用域就是一个变量的命名空间。

需要注意的是,流程控制块(if、while、for)中调用locals()实际上返回的是全局命名空间下的变量或方法。当然在全局下调用locals()也会返回全局命名空间下的变量或方法。

2 命名空间查询顺序

在python中,变量、函数、类等都需要先定义,再使用。

当一行代码要使用变量x的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:

局部命名空间:特指当前函数或类的方法。如果函数定义了一个局部变量 x,或一个参数 x,Python 将使用它,然后停止搜索。

全局命名空间:特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索全局。

内置命名空间:对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。

如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,如,NameError: name 'x' is not defined。

嵌套函数的情况:

先在当前 (嵌套的或 lambda) 函数的命名空间中搜索

然后是在父函数的命名空间中搜索

接着是模块命名空间中搜索

最后在内置命名空间中搜索嵌套函数的情况

3 命名空间的生命周期

不同的命名空间在不同的时刻创建,有不同的生存期。

内置命名空间在 Python 解释器启动时创建,会一直保留,不被删除。

模块的全局命名空间在模块定义被读入时创建,通常模块命名空间也会一直保存到解释器退出。

当函数被调用时创建一个局部命名空间,当函数返回结果或抛出异常时,被删除。每一个递归调用的函数都拥有自己的命名空间。

其他链接:http://www.cnblogs.com/windlaughing/archive/2013/05/26/3100362.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值