1、PyListObject對象
typedef struct {
PyObject_VAR_HEAD
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;
# 何問起 hovertree.com
PyObject_VAR_HEAD中的obsize表示該list對象含有的元素個數,而allocated表示該list對象占用的內存空間。ob_item實際指向一個指針數組,該數組中的每個指針指向真正的PyObject。

2、PyListObject對象使用
創建時,可指定大小,據此開辟元素列表所需內存。
op->ob_item = (PyObject **) PyMem_MALLOC(nbytes); memset(op->ob_item, 0, nbytes); # 何問起 hovertree.com
新建list對象後,可插入、添加、刪除元素。若allocated不足,可自動申請內存空間。
Python中list的內存增長模型如下:
0, 4, 8, 16, 25, 35, 46, 58, 72, 88
實現方式為:
new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6); # 何問起 hovertree.com
刪除list對象時
i = Py_SIZE(op);
while (--i >= 0) { // 逐一減小對真實PyObject對象的引用
Py_XDECREF(op->ob_item[i]);
}
PyMem_FREE(op->ob_item); // 然後釋放元素指針列表
而該List對象是否銷毀,如下。
3、PyListObject對象緩沖池
#define PyList_MAXFREELIST 80 static PyListObject *free_list[PyList_MAXFREELIST];
free_list是指針數組,指針指向list對象。
創建List對象時:
if (numfree) { #如果free_list有空閒,直接指向
numfree--;
op = free_list[numfree];
_Py_NewReference((PyObject *)op);
} else { # 否則新開辟內存空間
op = PyObject_GC_New(PyListObject, &PyList_Type);
}
刪除List對象時:
if (numfree < PyList_MAXFREELIST) # 如果有空余空間,將list對象放入free_List
free_list[numfree++] = op;
else # 否則直接銷毀
Py_TYPE(op)->tp_free((PyObject *)op);
# 何問起 hovertree.com