CPython 中术语“对象的值”的定义

问题描述 投票:0回答:1

是否可以在 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 次)。此外,我们还不清楚如何在对象的定义中解释术语“值”:

对象 - 具有状态(属性或值)和定义的行为(方法)的任何数据。

这个定义将“价值”与“属性”进行对比。也许我们应该按照我上面定义的狭义来解释“价值”,但我不确定。

python object language-lawyer cpython
1个回答
0
投票

这些提议的定义都不合适。对象的值没有正式的定义。它更像是一个非正式的、直观的概念。

我认为最接近对象值定义的是“对象所代表的信息”。例如,int对象

5
表示的信息是数字5。集合
{-1, -2}
{-2, -1}
表示相同的信息,并且具有相同的值。即使这些对象对应的内存内容不匹配,并且它们具有不同的字符串表示形式,情况也是如此。

比较运算符的数据模型文档

对象的值在Python中是一个相当抽象的概念:例如,对象的值没有规范的访问方法。此外,不要求对象的值应该以特定的方式构造,例如由其所有数据属性组成。比较运算符实现了对象值的特定概念。人们可以将它们视为通过比较实现来间接定义对象的值。

所以这是一种价值概念 - 根据

==
比较相等的对象在这种价值概念下具有相同的价值。但有些对象具有不寻常的比较实现。
float('nan')
与自身比较不等于,那么它的值是多少?并且
{1: 1, 2: 2}
{2: 2, 1: 1}
比较相等,但它们包含不同的顺序信息。顺序应该被视为字典值的一部分吗?

最终,开发团队只是懒得去尝试编写“价值”的正式、正式的定义,或者尝试将“价值”的概念强行定义为足够严格的东西。这样做并不能解决实际问题。

© www.soinside.com 2019 - 2024. All rights reserved.