首页 / 知识
python命名空间和作用域
2023-11-12 13:33:00
命名空间表示标识符(identifier)的可见范围,当前命名空间主要是通过Python字典实现的,不过通常不关心具体的实现方式(除非出于性能考虑),以后也有可能会改变其实现方式。有一些命名空间的例子:内置命名(像abs()这样的函数,以及内置异常名)集,模块中的全局命名,函数调用中的局部命名。某种意义上讲对象的属性集也是一个命名空间。有几个点需要注意下:
第一:不同命名空间中的命名没有任何联系,例如两个不同的模块可能都会定义一个名为maximize的函数而不会发生混淆--用户必须以模块名为前缀来引用它们。
第二:不同的命名空间在不同的时刻创建,有不同的生存期。包含内置命名的命名空间在Python解释器启动时创建,会一直保留,不被删除。模块的全局命名空间在模块定义被读入时创建,通常,模块命名空间也会一直保存到解释器退出。由解释器在最高层调用执行的语句,不管它是从脚本文件中读入还是来自交互式输入,都是__main__模块的一部分,所以它们也拥有自己的命名空间。(内置命名也同样被包含在一个模块中,它被称作__builtin__。)
第三:当调用函数时,就会为它创建一个局部命名空间,并且在函数返回或抛出一个并没有在函数内部处理的异常时被删除。(实际上,用遗忘来形容到底发生了什么更为贴切。)当然,每个递归调用都有自己的局部命名空间。
作用域是定义程序该如何搜索确切地“名字-对象”的名空间的层级关系。是一个Python程序可以直接访问命名空间的正文区域。意思是一个对名称的错误引用会尝试在命名空间内查找。尽管作用域是静态定义,在使用时他们都是动态的。每次执行时,至少有四个命名空间可以直接访问的作用域嵌套在一起:
第一:innermostscope,包含局部命名的使用域在最里面,首先被搜索;
第二:enclosingscope,中层的作用域,是内层嵌套作用域搜索起点,包含非局部,但是也非全局的命名
第三:Globalscope,包含当前模块的全局命名
第四:Built-inscope,包含内置命名的命名空间。
so,这么多的作用域,Python是按什么顺序搜索对应作用域的呢?著名的”LEGB-rule”,即scope的搜索顺序:Local->Enclosing->Global->Built-in;当有一个变量在local域中找不到时,Python会找上一层的作用域,即enclosing域(该域不一定存在)。enclosing域还找不到的时候,再往上一层,搜索模块内的global域。最后,会在built-in域中搜索。对于最终没有搜索到时,Python会抛出一个NameError异常。作用域可以嵌套。比如模块导入时。这也是为什么不推荐使用froma_moduleimport*的原因,导入的变量可能被当前模块覆盖。下面是一个例子:
defouter():
a=0
b=1
definner():
printa
printb
b=4
inner()
if__name__=="__main__":outer()
Traceback(mostrecentcalllast):
File"E:/PycharmProjects/CodeStatisticsTools/test_namespaces.py",line37,in
outer()
File"E:/PycharmProjects/CodeStatisticsTools/test_namespaces.py",line18,inouter
inner()
File"E:/PycharmProjects/CodeStatisticsTools/test_namespaces.py",line15,ininner
printb
UnboundLocalError:localvariable'b'referencedbeforeassignment
如果去掉b=4就能正常运行,这是为啥呢?在没有b=4这行代码时,Python解释器执行到inner()中的printb时,发现有个变量b在当前作用域(local)中无法找到变量b,于是尝试从enclosingscope中查找,找到后就能正常打印了。加上这行代码后,在当前作用域找到了b,但是变量b的赋值发生在print语句之后,于是抛出错误:变量在赋值前就被引用。赋值语句通常隐式地会创建一个局部(local)变量,即便该变量名已存在于赋值语句发生的上一层作用域中
以上内容为大家介绍了python命名空间和作用域,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们
最新内容
相关内容
为何你的Python代码应是扁平与稀疏
为何你的Python代码应是扁平与稀疏的,代码,培训,信息,观察,设计,工具,嵌套,闻闻,程序员,沉思,Python之禅之所以得名,正是由于它那简明扼要的规Python 之模块重载的五种方法
Python 之模块重载的五种方法,环境,培训,方法,模块,文件夹,例子,下面,内容,语句,请看,python环境准备新建一个foo文件夹,其下包含一个bar.py文如何提速优化python代码?
如何提速优化python代码?,代码,时间,数据,新增,写法,包装,情况,下来,面临,工作,Python是一种脚本语言,相比C/C++这样的编译语言,在效率和性能方简单是Python编程的第一要则
简单是Python编程的第一要则,代码,设计,第一,工具,技术,培训,策略,体系,对象,错综复杂,简单胜过复杂尚有选择余地时,应该选简单的方案。PythonPython 模块之输入不可见的密码
Python 模块之输入不可见的密码,密码,系统,情况,公共,位置,信息,电子,网上,认证,培训,密码对程序员来说尤其重要。你不应该在不加密的情况下Python标准库之collections模块
Python标准库之collections模块,名字,标准,信息,电话号码,培训,工厂,位置,简介,异常,对象,collections模块简介collections是Python标准库里python的十个第三方库
python的十个第三方库,数据,网络,服务,时间,代码,管理,标准,实时,分析,等级,1.BeautifulSoupBeautifulSoup是一个可以从HTML,XML进行提取文件如何迈出Python学习第一步
如何迈出Python学习第一步,时间,美元,亚马逊,代码,培训,工作,在线,教育,工程,租金,出于怀旧的缘故,我想分享我两年前的第一个Python程序。我最如何让Python代码更易维护
如何让Python代码更易维护,代码,项目,标准,工具,质量,地方,一致,更正,培训,控制权,检查你的代码的质量,通过这些外部库使其更易维护。可读性很Python模块化有哪些好处?
Python模块化有哪些好处?,管理,代码,软件,汽车,培训,复杂度,模块,功能,程序,好处,当然,如果不将程序分解成一个个独立的部分,而是整个一大坨,也Python可执行文件和模块
Python可执行文件和模块,标准,培训,模块,文件,属性,上面,内容,变量,函数,源码,python源代码文件按照功能可以分为两种类型:用于执行的可执行程Python查看模块中的属性
Python查看模块中的属性,名称,标准,环境,培训,属性,模块,对象,函数,定义,变量,内置函数dir可用于列出某模块中定义了哪些属性(全局名称空间)