4种Python命名空间?

时间:2014-05-12 17:50:41

标签: python namespaces

我是python的新手,我在作业中得到一个问题:

“在Python中命名四种类型的命名空间”

我来自java / C背景,据我所知,命名空间与范围有关?

我认为两种类型的命名空间都是全局的和本地的?

2 个答案:

答案 0 :(得分:1)

来自An Introduction to Python by Guido van Rossum and Fred L. Drake, Jr.

  

命名空间是从名称到对象的映射。   名称空间的示例包括:内置名称集(函数等)   as abs()和内置异常名称);模块中的全局名称;   和函数调用中的本地名称。从某种意义上说,一套   对象的属性也形成一个命名空间。 (我的重点)

所以有四个名称空间。在Python3(但不是Python2)中,列表推导也是have their own namespaces。在Python2和Python3中,生成器表达式都有自己的命名空间,您可以从以下代码引发的NameError中看到:

In [175]: (1 for i in range(1))
Out[175]: <generator object <genexpr> at 0x3a47d0f4>

In [176]: i
NameError: name 'i' is not defined

顺便说一句,范围与命名空间相关,但与命名空间不同。名称空间是名称和对象之间的映射,

  

作用域是Python程序的文本区域,其中名称空间是   可直接访问。 &#34;可直接访问&#34;这意味着一个   对名称的无限制引用试图在名称中找到名称   命名空间。 (我的重点)

答案 1 :(得分:0)

首先搜索的最里面的范围包含本地名称

从最近的封闭范围开始搜索的任何封闭函数的范围包含非本地名称,但也包含非全局名称

倒数第二个范围包含当前模块的全局名称

最外层范围(最后搜索)是包含内置名称的命名空间