关于CPython中reference、variable与identity关系的确认
我在Python术语表及教材中未找到reference、variable和identity的明确定义,现结合CPython实现及《Learning Python》(第5版)的论述,对相关术语做辨析与理解确认:
一、CPython中表述的同义词判断
针对对象obj,判断以下表述是否为同义词:
‘指向obj的reference’、‘obj的identity’、‘obj的内存地址’
- 不是同义词。
指向obj的reference在CPython中是PyObject*类型的指针,它存储了对象的内存地址;而obj的identity(即id(obj)返回值)在CPython中直接对应对象的内存地址,是一个整数标识。简单来说,reference是“指向地址的指针”,identity/内存地址是“指针存储的地址值”,二者本质不同。因此该组表述错误。
- 不是同义词。
‘variable’、‘命名reference’、‘绑定到某reference的标识符’
- 可视为同义词。Python中的
variable就是一个标识符(比如a),它与某个reference建立绑定关系;“命名reference”本质就是给这个reference赋予了标识符名称,和“绑定到reference的标识符”是同一概念。因此该组表述正确。
- 可视为同义词。Python中的
‘指向obj的变量a’、‘由标识符a与obj的identity组成的对’
- 不是同义词。变量
a绑定的是指向obj的reference,而非直接绑定obj的identity。identity是对象本身的属性,变量通过reference间接关联到对象,而非直接关联identity。因此该组表述错误。
- 不是同义词。变量
二、理解内容的正确性确认
结合《Learning Python》(第5版)中Mark Lutz的论述,梳理的以下理解均正确:
I. Python中所有(或多数)表达式返回对象的reference
Python中几乎所有表达式(字面量、函数调用、运算表达式等)执行后都会返回对象的reference。比如x = 3中,3这个字面量表达式返回整数对象3的reference,随后该reference被绑定到变量x。II. Python未指定reference的内部结构,但CPython中reference以C的
PyObject*指针实现,类似void*指针,自动解引用,其包含的内存地址即对应Python对象的identity
Python语言规范仅定义了reference的语义,未规定具体实现;在CPython中,reference用PyObject*指针实现,该指针存储的内存地址就是对象的identity(id(obj)返回的整数就是该地址的十进制表示)。Python会自动处理reference的解引用,开发者无需手动操作。III. Python变量是绑定到reference的标识符,‘指向obj的变量a’等价于‘标识符a与指向obj的reference组成的对’,变量并非Python对象
Python中的变量不是对象,只是一个标识符(名字),它的作用是与某个reference建立绑定,通过这个reference间接指向目标对象。因此“指向obj的变量a”就是标识符a和指向obj的reference的绑定对。IV. 初始问题中1部分错误,2正确,3错误
对应前面的同义词判断结果,该表述正确。
内容的提问来源于stack exchange,提问作者Kambal

