gpt4 book ai didi

python - Py_None 的值

转载 作者:太空狗 更新时间:2023-10-30 00:54:56 25 4
gpt4 key购买 nike

我很清楚None用于表示缺少值。但是由于在实现过程中一切都必须有一个潜在的值(value),我想看看使用了什么值(value)来表示没有值(value),关于 CPython .

我明白了,基于 documentation , 那NoneObject是单例。自从我的 c技能生锈了,我最好的业余猜测是 None 的值将是指向为 Py_None 分配的内存的指针目的;因为它是一个单例,所以这将保证唯一性。还是分配给cNULL其值为 0x0000基于 this question 中的第二个答案?

此外,文档还指出:

Note that the PyTypeObject for None is not directly exposed in the Python/C API.

我猜这意味着您无法通过源代码搜索找到它。 (我这样做了,不知道去哪里找,因为 object.c 天真地相信我能理解任何东西)

但我不确定我对此的看法,所以我问了。

什么是 c Py_None 的级别值CPython 中的对象?

最佳答案

Py_NoneInclude/object.h中的宏定义。它是 object.c_Py_NoneStruct 的别名,它是 PyObject 类型的静态(如在存储中)全局变量(这是一个结构)。它在 Python 术语中被指定为 NoneType(在 object.c 中定义在它的正上方,并且仅在 _Py_NoneStruct 中使用一次)。

所以它不是 NULL 或 C 中的任何其他特殊值,它是 _PyNone_Type 的单例 PyObject 实例。至于 _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

编辑:当 tp_new 字段为 NULL 时,似乎从 typeobject.c 中抛出错误。令人惊讶的是,尽管 _PyNone_Type 似乎是用非 NULL tp_new 定义的(指向 object.c 中的静态 none_new >).它可能会在某个时候设置为 NULL,但这只是一个实现细节,并不会真正影响您的问题范围。

关于python - Py_None 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33121048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com