1.PyListObject
[listobject.h]
typedef struct {
PyObject_VAR_HEAD //其中的obsize记录实际使用内存的对象数量
PyObject **ob_item; //指向列表存储空间中第一个元素地址
int allocated; //一共分配的内存空间对象数量(含未使用),obsize<=allocated
} PyListObject;
2.创建列表对象
首先会对传入的size做检查,其后检查缓冲池是否可用,根据情况创建或服用列表对象。列表对象创建完毕后,根据size大小为元素列表申请合理空间,并初始化。
[listobject.c]
PyObject *
PyList_New(Py_ssize_t size)
{
PyListObject *op;
size_t nbytes;
#ifdef SHOW_ALLOC_COUNT
static int initialized = 0;
if (!initialized) {
Py_AtExit(show_alloc);
initialized = 1;
}
#endif
if (size < 0) { //检查size是否为负数
PyErr_BadInternalCall();
return NULL;
}
if ((size_t)size > PY_SIZE_MAX / sizeof(PyObject *)) //检查size的值是否会导致内存溢出
return PyErr_NoMemory();
nbytes = size * sizeof(PyObject *);//计算创建元素列表所需的空间大小
if (numfree) { //检查list缓冲区是否可用
numfree--;
op = free_list[numfree];
_Py_NewReference((PyObject *)op);
#ifdef SHOW_ALLOC_COUNT
count_reuse++;
#endif
} else { //若缓冲区不可用,则需分配新的内存空间
op = PyObject_GC_New(PyListObject, &PyList_Type);
if (op == NULL)
return NULL;
#ifdef SHOW_ALLOC_COUNT
count_alloc++;
#endif
}
if (size <= 0)
op->ob_item = NULL;
else {
op->ob_item = (PyObject **) PyMem_MALLOC(nbytes); //为元素列表申请内存
if (op->ob_item == NU