-
获取类C的命名空间 C.dict
-
获取类C的实例c的命名空间 c.dict
-
获取函数f的命名空间 在内部使用locals()
-
获取module的命名空间 globals()
事实上,命名空间就是存储name和对象的对应关系的,那么当我们通过一个name来获取一个对象的时候,其查找命名空间的顺序在Python中是遵循LEGB的原则的。
(LEGB:Local -> Enclosing Function -> Global -> Builtins)
也就是说,遇到一个name的时候,Python解释器首先会去Local本地命名空间中查找,然后再去其所在函数的作用域中查找,如果还没找到,就会去Global全局命名空间中查找,最后会去__builtin__
(Python-builtin与builtins的区别与关系(超详细,经典))这个模块中去查找。
供测试代码:
x = 1234
__builtins__.s = 'Hello, World!'
y = 'c'
test = '1'
def test():
y = 'abc'
print(x)
print(y)
print(s)
print(locals())
test()
print(test)
var = 0
out_function = 1
def out_function():
var = 1
def inner_function():
print(var)
print(globals())
print(locals())
inner_function()
print(out_function)
out_function()
在上面的代码中,遵循LEGB原则,譬如输出var,inner_function的local()没有,然后在包裹它的封闭函数内找。
注意:inner_function在out_function的locals()中.out_function在globals()中,也就是说它和前一个out_function是平级的,所以后一个会覆盖前一个;如果把前一个移到后面,则调用out_function()会报错。
网友评论