我假设命名空间是内存中要分配名称的分配位置。或者他们是一回事吗?
答案 0 :(得分:0)
名称是传统上被认为是“变量”的名称。
a = 1
b = 2
a
和b
都是“名字”。如果您尝试引用尚未设置的名称,则会获得NameError
:
>>> print c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined
命名空间是名称所在的位置。通常这是一个模块。每个模块(文件)都有自己的命名空间 - 或者它自己的一组名称映射到相应的值(在上面的例子中为a->1, b -> 2
)。您可以使用python的import
功能以不同的方式“合并”模块名称空间。
import foo # bring foo into the current namespace
from foo import * # bring all of the names in foo's namespace into the current namespace
类也可以被视为命名空间,尽管如果没有一些工作,您无法将名称直接导入模块命名空间。
class Namespace(object):
pass
namespace = Namespace()
namespace.a = 1
namespace.b = 2
正如在评论中的一些讨论中所指出的,我应该提到python中的命名空间通常是由字典实现,因为它们非常适合将名称映射到值/对象。在类(或类实例)上,您可以通过ClassName.__dict__
或instance.__dict__
访问字典,如果导入module.__dict__
,您可以对模块执行相同操作:module
在通用/语言不可知的级别,我认为命名空间是将一组相关名称(及其相关值)绑定在一起并防止这些名称与不同命名空间中的类似名称混淆的一种方式。例如我可以foo.something
和bar.something
。这两个名称都是something
,但它们分别位于不同的名称空间(foo
和bar
),因此我们可以区分它们。
答案 1 :(得分:0)
名称空间是名称和对象之间的链接所在的理论空间:即名称和对象之间的映射。
名称是脚本中写入的标识符
对象是位于存储器中的位结构
实现此理论命名空间的数据结构是一个字典。 “实现”意味着它是将数据保存在内存位中的对象
但是这个字典引用的对象并没有在内存的分隔部分中组合在一起,它们位于内存的任何地方,字典的作用是知道如何在开始时只用一个名字来查找它们中的任何一个。解释器遇到名称
这就是为什么我写它是一个理论空间,虽然它在记忆中有一个具体的存在。这是理论上的,因为在内存中不同位置传播的几个对象可以被认为属于一个命名空间,这是Python解释器的底层功能的结果,也就是说data model及其execution model
事实上,事情更复杂,在游戏中有一个符号表。但是我对Python的C实现还不够称道。顺便说一句,人们很少提到符号表。
但是,我希望上面的解释会在你的脑海中对命名空间的主题有所启发。
答案 2 :(得分:-1)
'我假设名称空间是内存中分配名称的地方。 是的。