本系列文章都是基于陈儒的Python源码剖析一书。
打开object.h 文件
typedef struct _object {
PyObject_HEAD
} PyObject;
上述代码定义了一个数据类型PyObject. 可以发现PyObject中就是PyObject_HEAD。
#define PyObject_HEAD \
_PyObject_HEAD_EXTRA \
Py_ssize_t ob_refcnt; \
struct _typeobject *ob_type;
可以发现 PyObject_HEAD 是一个宏定义。其中 _PyObject_HEAD_EXTRA也是一个宏定义。
#ifdef Py_TRACE_REFS
/* Define pointers to support a doubly-linked list of all live heap objects. */
#define _PyObject_HEAD_EXTRA \
struct _object *_ob_next; \
struct _object *_ob_prev;
#define _PyObject_EXTRA_INIT 0, 0,
#else
#define _PyObject_HEAD_EXTRA
#define _PyObject_EXTRA_INIT
#endif
在release编译模式下 Py_TRACE_REFS 是没有被定义的。所以根据条件编译的结果来说
_PyObject_HEAD_EXTRA 为空。所以PyObject可以表述为下面形式: