命名空间与作用域
一、命名空间:
保存程序中的变量名和值的地方,本质是一个字典,其作用是用来记录变量名称和值,变量名在字典中充当key,值充当value。
命名空间分为三种:
1.局部命名空间:函数都有自己的命名空间,记录函数的变量,参数。2.全局命名空间:模块拥有的空间,记录了模块变量,函数,类和导入模块。3.内置命名空间:任何模块均可访问,放着内置函数和异常。
对于命名空间在执行的过程需要注意两个容易混淆的东西:
第一个代码加载过程:
内置命名空间(程序运行前加载)---->全局命名空间(当程序运行的时候加载全局命名空间)----->局部命名空间(函数调用的时候加载)
第二个查找顺序:
当前 (嵌套的或 lambda) 函数的命名空间中搜索 -->在父函数的命名空间中搜索 -->模块命名空间中搜索–>在内置命名空间中搜索 (在哪里查找到就停止搜索)
代码:
name="snowdream" #全局命名空间
def func(): #局部命名空间
name="snow"
print(name)
func()
结果:
二、作用域:
是变量在程序中的可应用范围这里访问
的顺序容易与命名空间混淆,我们知道作用域分为四类:局部作用域(Loca)、嵌套作用域(Enclosing)、全局作用域(Global)、内建作用域(Builtin)。其中访问顺序为:局部作用域(Loca)–>嵌套作用域(Enclosing)–>全局作用域(Global)–>内建作用域(Builtin) [从第一处能够找到这个变量名的地方停下来。如果变量名在整个的搜索过程 中都没有找到,Python就会报错]总结:我认为命名空间和作用域的关系:命名空间定义了在某个作用域内变量名和绑定值之间的对应关系,命名空间是键值对的字典,作用域定义了命名空间中的变量能够在多大范围内起作用。
代码:
id=10 ##全局作用域
def outter():
id=11 #嵌套作用域
def inner ():
id=12 #内建作用域
print(id)
inner()
outter()