没有合适的资源?快使用搜索试试~ 我知道了~
首页Python进阶:探索命名空间与作用域的详细解析
Python进阶:探索命名空间与作用域的详细解析
0 下载量 24 浏览量
更新于2024-09-01
收藏 107KB PDF 举报
本文将深入探讨Python进阶中的关键概念——命名空间与作用域。首先,我们了解到命名空间是编程中用于存储变量、函数、类等标识符和其关联对象的一种机制,它通过字典实现,并帮助解决名字冲突问题。在Python中,主要有三种命名空间类型:内置命名空间(如内置函数和异常)、模块全局命名空间(模块内的全局变量)和局部命名空间(函数或代码块内部的变量)。命名空间的生命周期各异,内置命名空间伴随解释器启动和关闭,而模块和局部命名空间则随其创建和销毁环境。 作用域则规定了变量和函数的可访问范围。在Python中,作用域分为全局作用域(在整个模块范围内可见)和局部作用域(只在特定函数或代码块内可见)。对于函数和类定义,它们有自己的命名空间,且类的命名空间在类定义完成后才销毁,但实际上类对象包含了这个命名空间的内容。 理解命名空间和作用域对编写高效、无冲突的Python代码至关重要,它有助于管理代码的复杂度,提高代码的可读性和维护性。学习如何正确使用这些概念,能够帮助程序员避免潜在的错误和提高代码的组织结构。因此,无论是初学者还是进阶开发者,掌握这些基础概念都是提升Python编程技能的基础。
资源详情
资源推荐
Python进阶进阶_关于命名空间与作用域关于命名空间与作用域(详解详解)
下面小编就为大家带来一篇Python进阶_关于命名空间与作用域(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
写在前面写在前面
如非特别说明,下文均基于Python3
命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字、对象及其绑定的文章。
1. 命名空间命名空间
1.1 什么是命名空间什么是命名空间
Namespace命名空间,也称名字空间,是从名字到对象的映射。Python中,大部分的命名空间都是由字典来实现的,但是本文的不会涉及命名空间的实现。命名空间的一大作用是避免名字冲突:
def fun1():
i = 1
def 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 与命名空间的关系与命名空间的关系
现在,命名空间持有了名字。作用域是Python的一块文本区域,即一块代码区域,需要代码区域引用名字(访问变量),那么必然作用域与命名空间之间就有了联系。
顾名思义,名字作用域就是名字可以影响到的代码文本区域,命名空间的作用域就是这个命名空间可以影响到的代码文本区域。那么也存在这样一个代码文本区域,多个命名空间可以影响到它。
作用域只是文本区域,其定义是静态的;而名字空间却是动态的,只有随着解释器的执行,命名空间才会产生。那么,在静态的作用域中访问动态命名空间中的名字,造成了作用域使用的动态性。
那么,可以这样认为:
静态的作用域,是一个或多个命名空间按照一定规则叠加影响代码区域;运行时动态的作用域,是按照特定层次组合起来的命名空间。静态的作用域,是一个或多个命名空间按照一定规则叠加影响代码区域;运行时动态的作用域,是按照特定层次组合起来的命名空间。
在一定程度上,可以认为动态的作用域就是命名空间动态的作用域就是命名空间。在后面的表述中,我会把动态的作用域与其对应命名空间等同起来。
2.3 名字搜索规则名字搜索规则
在程序中引用了一个名字,Python是怎样搜索到这个名字呢?
在程序运行时,至少存在三个命名空间可以被直接访问的作用域:
Local
首先搜索,包含局部名字的最内层(innermost)作用域,如函数/方法/类的内部局部作用域;
Enclosing
根据嵌套层次从内到外搜索,包含非局部(nonlocal)非全局(nonglobal)名字的任意封闭函数的作用域。如两个嵌套的函数,内层函数的作用域是局部作用域,外层函数作用域就是内层函数的
Enclosing作用域;
Global
倒数第二次被搜索,包含当前模块全局名字的作用域;
Built-in
最后被搜索,包含内建名字的最外层作用域。
程序运行时,LGB三个作用域是一定存在的,E作用域不一定存在;若程序是这样的:
i = 1
print(i)
局部作用域在哪里呢?我们认为(Python Scopes And Namespaces):
Usually, the local scope references the local names of the (textually) current function. Outside functions, the local scope references the same namespace as the global scope: the module's namespace.
Class definitions place yet another namespace in the local scope.
一般地,局部作用域引用函数中定义的名字。函数之外,局部作用域和全局作用域引用同一个命名空间:模块的明星空间。然而类型的局部作用域引用了类定义新的命名空间。
Python按照以上L-E-G-B的顺序依次在四个作用域搜索名字。没有搜索到时,Python抛出NameError异常。
2.4 何时引入作用域我们知道:何时引入作用域我们知道:
我们知道:
在Python中一个名字只有在定义之后,才能引用。
print(i)
直接引用未定义的名字i,按照搜索规则,在LGB三个作用域均没有搜索到名字i(LB相同命名空间)。抛出NameError异常:
Traceback (most recent call last):
File "scope_test.py", line 15, in <module>
print(i)
下载后可阅读完整内容,剩余3页未读,立即下载
weixin_38595690
- 粉丝: 6
- 资源: 942
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功