我是python的新手,我在作业中得到一个问题:
“在Python中命名四种类型的命名空间”
我来自java / C背景,据我所知,命名空间与范围有关?
我认为两种类型的命名空间都是全局的和本地的?
答案 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)
首先搜索的最里面的范围包含本地名称
从最近的封闭范围开始搜索的任何封闭函数的范围包含非本地名称,但也包含非全局名称
倒数第二个范围包含当前模块的全局名称
最外层范围(最后搜索)是包含内置名称的命名空间