Python 的名字空间是 Python 一个非常核心的内容。Python 中name-object的关联存储在不同的作用域中,各个不同的作用域是相互独立的。在上面的栗子中,我们定义了两次 i,在 test 函数中是 i-L,在外面是 i-G。这就是 LEGB 的作用。简而言之,LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__. 所以,在 Python 中检索一个变量的时候,优先回到 locals 里面来检索,检索不到的情况下会检索 enclosing ,enclosing 没有则到 globals 全局变量里面检索,最后是到 builtins 里面来检索。当然,因为 builtins 的特殊性,我们可以直接在 builtins 里面添加变量,这样就可以在任意模块中访问变量,不过这种方法太过于变态,不推荐这么做。在 Python3中提供了一个 nonlocal关键字来修改外部嵌套函数的名字空间,但是要使用 Python3才有,我等使用 Python2的只能眼馋一下。这种非常规用法不建议使用。

深入理解Python中命名空间的查找规则LEGB

深入理解Python中命名空间的查找规则LEGB

深入理解Python中命名空间的查找规则LEGB