我很清楚None
用于表示缺乏价值。但由于在实现过程中一切都必须有一个潜在的价值,所以我想看看使用了什么值来表示没有值,关于CPython
.
我理解,基于文档 https://docs.python.org/3/c-api/none.html#c.Py_None, that NoneObject
是一个单例。自从我的c
技能已经生锈了,我最好的、业余的猜测是,None
将是指向分配给的内存的指针Py_None
目的;因为它是一个单例,这将保证唯一性。或者它被分配给c
's NULL
其值为0x0000
基于第二个答案这个问题 https://softwareengineering.stackexchange.com/questions/147713/where-are-null-values-stored-or-are-they-stored-at-all?
此外,文档还指出:
请注意,None 的 PyTypeObject 并未直接在 Python/C API 中公开。
我猜这意味着您无法通过源代码搜索找到它。 (我这样做了,不知道去哪里寻找object.c https://hg.python.org/cpython/file/c6880edaf6f3/Objects/object.c天真地相信我能理解任何事情)
但我不确定我对此的看法,所以我问。
是什么c
的电平值Py_None
对象在CPython
?
Py_None
是一个宏定义Include/object.h
。它是一个别名_Py_NoneStruct
in object.c
这是一个静态(如在存储中)全局变量PyObject
类型(这是一个结构)。它在 Python 术语中被指定为NoneType
(在其上方定义object.c
并且仅使用一次_Py_NoneStruct
).
所以它不是 NULL 或 C 中的任何其他特殊值,它是一个单例PyObject
的实例_PyNone_Type
。至于_PyNone_Type
PyTypeObject
没有被曝光,我想他们指的是static
关键字(即内部链接),这意味着PyTypeObject
只能在以下范围内访问object.c
并且仅用于定义一次PyNone
.
只是补充一点,每当文档说PyNone
没有类型,不应该从字面上理解。它有一种特殊的类型,NoneType
,您仍然可以通过None
单例,但您无法创建新实例或执行普通类型可以执行的任何其他操作。似乎存在不创建新实例的硬编码限制,尽管我无法准确找到它在 CPython 源代码中定义的位置,但您可以在尝试创建新实例时看到其效果:
>>> type(None)
<type 'NoneType'>
>>> type(None)()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot create 'NoneType' instances
编辑:似乎错误是从typeobject.c
当。。。的时候tp_new
字段为 NULL。但令人惊讶的是_PyNone_Type
似乎是用非 NULL 定义的tp_new
(指向静态none_new
in object.c
)。之后在某个时候它可能会被设置为 NULL,但这只是一个实现细节,对于您的问题范围并没有真正产生影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)