Python内存管理与垃圾回收机制

引用计数

环状双向链表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

 

上一篇:服务器运维抓包练习


下一篇:控制input文本框只能输入正整数