命名空间(namespace)

A namespace is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries。

实际上在Python中,命名空间是一个字典(dictionary),它的键就是变量名,它的值就是那些变量的值。
在一个Python 程序中的任何一个地方,都存在几个可用的命名空间:

  1. 每个函数都有着自已的命名空间,叫做局部命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量。
  2. 每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
  3. 还有就是内置命名空间,任何模块均可访问它,它存放着内置的函数和异常。

作用域(scope)

Scope是Python程序的一块文本区域。在该文本区域中,对namespace是可以直接访问,而不需要通过属性来访问。

  1. 直接访问:对一个变量名的引用会在所有namespace中查找该变量,而不是通过属性访问。
  2. 属性访问:所有名字后加.的都认为是属性访问。

    区别

    在Python中,scope是由namespace按特定的层级结构组合起来的。scope一定是namespace,但namespace不一定是scope.

    LEGB-rule

    python的作用域一共有4中,分别是:
  3. L (Local) 局部作用域,比如一个函数/方法内部。
  4. E (Enclosing) 闭包函数外的函数中
  5. G (Global) 全局作用域
  6. B (Built-in) 内建作用域,包含了内建的变量/关键字等。

scope的搜索顺序:

1
Local -> Enclosing -> Global -> Built-in