名称空间和名称有什么区别?

2024-04-20 00:30:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我假设名称空间是内存中存储名称的分配位置。还是同一件事?你知道吗


Tags: 内存名称空间
3条回答

'我假设名称空间是内存中存储名称的分配位置。' 是的。你知道吗

名称空间是名称和对象之间的联系所在的理论空间:即名称和对象之间的映射。
名称是写在脚本中的标识符。
对象是内存中位的结构。
实现这个理论名称空间的数据结构是一个术语表。”Implements”表示在内存位中保存此数据的对象。
但是,本词典引用的对象并不是全部分组在内存的一个分隔部分中,它们在内存中无处不在,当解释器遇到一个名称时,词典的作用是知道如何在一开始就用一个名称找到它们中的任何一个。
这就是为什么我写它是一个理论空间,虽然它在记忆中有一个具体的存在。这是理论上的,因为分布在内存中不同位置的几个对象可以被认为属于一个名称空间,这是Python解释器的under-the-hood函数的结果,也就是说它的data modelexecution model

其实事情比较复杂,引擎盖下有一个符号表在游戏中。但是对于Python的C实现,我没有足够的能力说更多。顺便说一下,人们很少提到符号表。你知道吗

然而,我希望以上的解释能让你对名称空间的主题有所了解。你知道吗

名称在传统上可以被认为是“变量”。你知道吗

a = 1
b = 2

ab都是“名称”。如果您尝试引用尚未设置的名称,则会得到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,则可以对模块执行相同的操作:module.__dict__。你知道吗

在泛型/语言不可知的级别上,我认为名称空间是一种将一组相关名称(及其相关值)绑定在一起的方法,可以防止这些名称与不同名称空间中的类似名称混淆。e、 我可以有foo.somethingbar.something。这两个名字都是something,但是它们生活在不同的名称空间中(分别是foobar),所以我们可以区分它们。你知道吗

相关问题 更多 >