[关闭]
@songying 2018-07-18T10:13:29.000000Z 字数 911 阅读 1322

python 命名空间

python


什么是命名空间?

命名空间是名字和对象的映射。目前,命名空间是用字典来实现的,它的键值是变量名,它的值是那些变量的值。

LEGB

  • 局部命名空间(local):函数或类的方法的命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量。
  • 闭包命名空间(enclosing function):闭包函数 的名称空间(Python 3 引入)。
  • 全局命名空间(global): 每个模块自己的命名空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
  • 内置命名空间(builtin):任何模块均可访问它,它存放着内置的函数和异常。

命名空间查找顺序

当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:

  1. 局部命名空间:特指当前函数或类的方法。如果函数定义了一个局部变量 x,或一个参数 x,Python 将使用它,然后停止搜索。

  2. 全局命名空间:特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。

  3. 内置命名空间:对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。

  4. 如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,如,NameError: name 'aa' is not defined。

命名空间的生命周期

不同的命名空间在不同的时刻创建,有不同的生存期。

  1. 内置命名空间在 Python 解释器启动时创建,会一直保留,不被删除。

  2. 模块的全局命名空间在模块定义被读入时创建,通常模块命名空间也会一直保存到解释器退出。

  3. 当函数被调用时创建一个局部命名空间,当函数返回结果 或抛出异常时,被删除。每一个递归调用的函数都拥有自己的命名空间。

locals() 与 globals()

globals()

以字典类型返回当前位置的全部全局变量。

  1. globals()

locals()

以字典类型返回当前位置的全部局部变量。
对于函数, 方法, lambda 函式, 类, 以及实现了 __call__ 方法的类实例, 它都返回 True。

  1. locals()

https://segmentfault.com/a/1190000004519811

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注