Python的命名空间的本质是一个字典,用来记录变量名称和值。字典的key是变量的名称,字典的value对于的是变量的值。
例如 {‘name’:’zs’,’age’:10}
命名空间一共分为三种:局部命名空间、全局命名空间、内置命名空间
局部空间:
每个函数都有自己的命名空间,叫做局部空间,它记录了函数的变量,包括函数的参数 和局部定义的变量
全局空间:
每个模块拥有他自己的命名空间,叫做全局命名空间,他记录了模块的变量,包括函数、类、其他导入的模块
内置名称空间:
任何模块都可以访问他,他存放着内置的函数和异常
input print str list tuple
命名空间的访问
局部名称空间使用 locals()函数来访问
全局命名空间的访问使用 globals()函数访问
def func(name,age):
num = 10
ret = locals() #局部命名空间
print(ret) #{'age': '10', 'name': 'zs', 'num': 10}
func('zs','10')
a = 10
def func(name,age):
num = 10
ret = locals() #局部命名空间
print(ret) #{'age': '10', 'name': 'zs', 'num': 10}
func('zs','10')
ret = globals() #获取全局变量
print(ret)
{'age': '10', 'name': 'zs', 'num': 10}
{'__spec__': None, '__name__': '__main__', 'ret': {...}, '__cached__': None, '__file__': 'D:/Pythonworkspace/day08/demo1.py', 'func': <function func at 0x00000000011867B8>, '__doc__': '\n命名空间\n', 'a': 10, '__builtins__': <module 'builtins' (built-in)>, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000FA8AC8>}
里面有很多内置变量名称
2命名空间的加载顺序
内置命名空间(程序运行前加载)------>>>
全局命名空间(程序运行中:从上到下加载)---------->>>
局部命名空间(程序运行中:调用时才加载)当函数返回结果或抛出异常时,被删除。每一个递归调用的函数都用自己的命名空间
3 命名空间的查找顺序
当使用某个变量的时候,先从局部命名空间中找,如果能找到则停止搜索,如果找不到在去全局名称空间中查找,如果找到则停止搜索,如果找不到则到内置名称空间中查找,如果找不到则报错。
id= 10
def func():
id = 20
print(id) 20
func()
print(id) 10
查找顺序 局部 全局 内置 如果先从局部命名空间中查找到 则停止搜索,一次向下进行查找,做后如果查不到就报错 如果一开始就在全局空间中查找 ,找不到就去内置空间中去查找 ,找到就打印,找不到就报错
嵌套函数的情况:
1、先在当前 (嵌套的或 lambda) 函数的命名空间中搜索
2、然后是在父函数的命名空间中搜索
3、接着是模块命名空间中搜索
4、最后在内置命名空间中搜索
id = 10
def outter():
id = 11
def inner():
id = 12
print(id) #12
inner()
outter()