一个作用域对应一个名字空间 注:名字空间相当于(key,value)字典
一个模块是一个作用域,模块中有一个名字空间
一个类是一个作用域,类中有一个名字空间
一个函数内部是一个作用域,对应一个名字空间
名称绑定相当于往字典中添加(key,value)
名称绑定的情形:
1、变量赋值,定义函数,定义类的时候
2、传参的时候,名称绑定到函数的作用域
3、import语句的时候,把import后面的名称绑定到当前名称空间
4、其他情况,略
名称解析的过程:
相当于查找字典中的(key,value)
查找顺序为LEGB(local, Enclosing,Globle,Build-in) 名称绑定到一个代码块中,那么是局部变量,如果绑定到模块级别那么就是全局变量
#Enclosing:非局部也非全局变量
#两个嵌套函数,内层函数可能搜索外层函数的namespace但该namespace对内层函数而言既非全局也非局部
def closure(str): # str对内层来说即非全局也非局部
def decrator(func):
def wrapper():
....
if (str) # 解析的时候先查找本地的str(local),再查找Enclosing的str
func()
else
....
....
return wrapper
return decrator
如果先解析到了变量,而绑定在解析之后,会报错UnboundLocalError
4.内建名字空间
在查找内建名字空间的时候,会访问当前代码块的全局名字空间中的 __builtins__名字,这个名字引用的是一个名字字典或者是一个模块。在 __main__ 模块中, __builtins__ 的引用是内建模块 builtins,然而,如果是在其他模块中, __builtins__ 引用的是 builtins 模块的名字字典。
print(globals())
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000000211B0F0>, '__spec__': None, '__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/PycharmProjects/15group/level_2/day2/core/mm/aaad.py', '__cached__': None}
import builtins print(builtins.abs(-2)) #内建模块可以调用内置方法
注意:
CPython的实现中,不能手动修改 __builtins__ 这个变量,如果需要覆盖这个内建名字空间中的名字,需要导入 builtins 模块,然后修改这个模块中相应的属性。