是否可以在 CPython 中给出术语“对象的值”的正式定义?在简要阅读了一些参考文章和 Python 教程后,我得出的结论是,在大多数情况下,这个术语意味着以下两件事之一(取决于上下文)。这个结论到底对还是错?
从广义上讲,“对象的值”是指存储在对象结构体中的所有数据(该结构体派生自 PyObject 结构体),不包括类型指示符和引用计数器。换句话说,它是存储在对象的结构字段中的数据(字节集合),不包括
ob_type
和 ob_refcnt
字段(可能还有一些与垃圾收集相关的其他簿记字段)。看来Python对象的实例变量也存储在这个结构中。但是,我不确定绑定方法 - 它们在创建后存储在哪里。int
类型的对象都是由以下结构生成的(扩展 C 宏后):
struct _longobject {
Py_ssize_t ob_refcnt; /* object reference counter */
PyTypeObject* ob_type; /* object type designator*/
Py_ssize_t ob_size;
digit ob_digit[1];
};
因此,它的值是存储在
ob_size
和 ob_digit[1]
中的数据(字节集合)。
从狭义上讲,“对象的值”是指由
obj.__repr__()
或 obj.__str__()
评估的对象的字符串表示形式。这种表示通常不会显式存储在 PyObject 结构中,而是通过上述绑定方法进行评估,这些方法在此评估期间使用 PyObject 结构的多个字段。请注意,对于某些类型的对象(例如,函数对象或文件对象),此字符串表示形式很简单,不包含任何有价值的信息。
Python 官方参考文献没有对象值的定义。就是这么说的
每个对象都有一个身份、类型和值。
Python 术语表也没有这样的定义(尽管术语“值”在其中出现了 34 次)。此外,我们还不清楚如何在对象的定义中解释术语“值”:
对象 - 具有状态(属性或值)和定义的行为(方法)的任何数据。
这个定义将“价值”与“属性”进行对比。也许我们应该按照我上面定义的狭义来解释“价值”,但我不确定。
这些提议的定义都不合适。对象的值没有正式的定义。它更像是一个非正式的、直观的概念。
我认为最接近对象值定义的是“对象所代表的信息”。例如,int对象
5
表示的信息是数字5。集合{-1, -2}
和{-2, -1}
表示相同的信息,并且具有相同的值。即使这些对象对应的内存内容不匹配,并且它们具有不同的字符串表示形式,情况也是如此。
比较运算符的数据模型文档说
对象的值在Python中是一个相当抽象的概念:例如,对象的值没有规范的访问方法。此外,不要求对象的值应该以特定的方式构造,例如由其所有数据属性组成。比较运算符实现了对象值的特定概念。人们可以将它们视为通过比较实现来间接定义对象的值。
所以这是一种价值概念 - 根据
==
比较相等的对象在这种价值概念下具有相同的价值。但有些对象具有不寻常的比较实现。 float('nan')
与自身比较不等于,那么它的值是多少?并且 {1: 1, 2: 2}
和 {2: 2, 1: 1}
比较相等,但它们包含不同的顺序信息。顺序应该被视为字典值的一部分吗?
最终,开发团队只是懒得去尝试编写“价值”的正式、正式的定义,或者尝试将“价值”的概念强行定义为足够严格的东西。这样做并不能解决实际问题。