标签:The space 本质 函数定义 fun 自己的 ace 其它 全局
A namespace is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries。
1、 局部命名空间:特指当前函数或类的方法。如果函数定义了一个局部变量 x,或一个参数 x,Python 将使用它,然后停止搜索。
2、 全局命名空间:特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。
3、 内置命名空间:对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。
4、 如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,如,NameError: name ‘aa‘ is not defined。
1、先在当前 (嵌套的或 lambda) 函数的命名空间中搜索
2、然后是在父函数的命名空间中搜索
3、接着是模块命名空间中搜索
4、最后在内置命名空间中搜索
info = "Adress : " def func_father(country): def func_son(area): city= "Shanghai " #此处的city变量,覆盖了父函数的city变量 print(info + country + city + area) city = " Beijing " #调用内部函数 func_son("ChaoYang "); func_father("China ")
输出:Adress : China Shanghai ChaoYang
以上示例中,info在全局命名空间中,country在父函数的命名空间中,city、area在自己函数的命名空间中
1、内置命名空间在 Python 解释器启动时创建,会一直保留,不被删除。
2、模块的全局命名空间在模块定义被读入时创建,通常模块命名空间也会一直保存到解释器退出。
3、当函数被调用时创建一个局部命名空间,当函数返回结果 或 抛出异常时,被删除。每一个递归调用的函数都拥有自己的命名空间。
Python 的一个特别之处在于其赋值操作总是在最里层的作用域。赋值不会复制数据——只是将命名绑定到对象。删除也是如此:"del y" 只是从局部作用域的命名空间中删除命名 y 。事实上,所有引入新命名的操作都作用于局部作用域。
i=1 def func2(): i=i+1 func2(); #错误:UnboundLocalError: local variable ‘i‘ referenced before assignment
由于创建命名空间时,python会检查代码并填充局部命名空间。在python运行那行代码之前,就发现了对i的赋值,并把它添加到局部命名空间中。当函数执行时,python解释器认为i在局部命名空间中但没有值,所以会产生错误。
def func3(): y=123 del y print(y) func3() #错误:UnboundLocalError: local variable ‘y‘ referenced before assignment #去掉"del y"语句后,运行正常
四、locals 与 globals 之间的一个重要的区别
def func1(i, info): x = 12345 print(locals()) locals()["x"]= 6789 print("x=",x) y=54321 func1(1 , "first") globals()["y"]= 9876 print( "y=",y)
输出:
locals 实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行改变对局部名字空间中的变量值并无影响。
globals 返回实际的全局名字空间,而不是一个拷贝。所以对 globals 所返回的 dictionary 的任何的改动都会直接影响到全局变量。
标签:The space 本质 函数定义 fun 自己的 ace 其它 全局
原文地址:https://www.cnblogs.com/siegeboc/p/9757668.html