命名空间(namespace)
A namespace is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries。
实际上在Python中,命名空间是一个字典(dictionary),它的键就是变量名,它的值就是那些变量的值。
在一个Python 程序中的任何一个地方,都存在几个可用的命名空间:
- 每个函数都有着自已的命名空间,叫做局部命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量。
- 每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
- 还有就是内置命名空间,任何模块均可访问它,它存放着内置的函数和异常。
作用域(scope)
Scope是Python程序的一块文本区域。在该文本区域中,对namespace是可以直接访问,而不需要通过属性来访问。
- 直接访问:对一个变量名的引用会在所有namespace中查找该变量,而不是通过属性访问。
- 属性访问:所有名字后加.的都认为是属性访问。
区别
在Python中,scope是由namespace按特定的层级结构组合起来的。scope一定是namespace,但namespace不一定是scope.LEGB-rule
python的作用域一共有4中,分别是: - L (Local) 局部作用域,比如一个函数/方法内部。
- E (Enclosing) 闭包函数外的函数中
- G (Global) 全局作用域
- B (Built-in) 内建作用域,包含了内建的变量/关键字等。
scope的搜索顺序:1
Local -> Enclosing -> Global -> Built-in