引用计数
环状双向链表refchain
在Python程序中创建的任何对象都会放在refchain链表中
name = "featherwit" age = 18 hobby = ["篮球", "乒乓球"]
在创建对象的时候, Python内部会创建一些数据, 比如:[上一个对象的指针、下一个对象的指针、类型、引用个数、值]
源码
#define PyObject_HEAD PyObject ob_base; #define PyObject_VAR_HEAD PyVarObject ob_base; // 宏定义, 包含上一个对象的指针、下一个对象的指针、用户构造双向链表用, (放到refchain链表中时, 要用到) #define _PyObject_HEAD_EXTRA struct _object *_ob_next; struct _object *_ob_prev; typedef struct _object{ _PyObject_HEAD_EXTRA // 用户构造双向链表 Py_ssize_t ob_refcnt; // 引用计数器 struct _typeobject *ob_type; // 数据类型 } PyObject; typedef struct { PyObject ob_base; // PyObject对象 Py_ssize_t ob_size; /* Number of items in variable part, 即: 元素个数 */ } PyVarObject;
在C语言源码中, 使用PyObject结构体来体现每个对象都有的相同的属性;
在C语言源码中, 使用PyVarObject结构体来体现多个元素组成的对象: PyObject结构体(4个值) + ob_size