2018年9月27日 / 91次阅读
Python
名字空间(namesapce)这个概念很枯燥,但是很重要,所以要耐心些。
Python使用叫做名字空间的东西来记录变量的轨迹(很多其它编程语言都有这个概念)。名字空间只是一个 字典,它的键字就是变量名,字典的值就是那些变量的值。实际上,名字空间可以象Python的字典一样进行访问。
在一个Python程序中的任何一个地方,都存在几个可用的名字空间。每个函数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局部定义的变量。每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常 量。还有就是内置名字空间,任何模块均可访问它,它存放着内置的函数和异常。
当一行代码要使用变量 x 的值时,Python会到所有可用的名字空间去查找变量,按照如下顺序:
1, 局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x,Python将使用这个变量,然后停止搜索。
2, 全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python将使用这个变量然后停止搜索。
3, 内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python将假设 x 是内置函数或变量。
如果Python在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 的异常,同时传 递 There is no variable named 'x' 这样一条信息。
象Python中的许多事情一样,名字空间在运行时直接可以访问。特别地,局部名字空间可以通过内置的 locals() 函数来访问。全局(模块级别)名字空间可以通过 globals() 函数来访问。(用locals()和globals()函数查看Python符号表)
python的名字空间,除了以上一般性的说明,还有更细致的层次划分,比如我们在函数中又定义了一个函数,函数嵌套定义,就在函数的局部空间和模块的全局空间中,产生了中间层次的局部空间。关于这个细节,请参考这篇文章:python的global和nonlocal
本文链接:https://www.maixj.net/ict/python-namesapce-18991
《Python的名字空间(namesapce)》有1条留言
©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。
namespace在程序运行过程中,被动态的创建和销毁。比如函数的局部空间 ,在函数调用时创建,在函数返回后销毁。
zz这个变量不仅是在全局namespace不存在,在foo函数的局部空间,在foo函数返回之后也消失不见。 [ ]