源码位置 Include/listobject.h |
Objects/listobject.c
定义
1234567 | typedef struct { PyObject_VAR_HEAD PyObject **ob_item; Py_ssize_t allocated;} PyListObject; |
说明
1234567891011121314 | 1. PyObject_VAR_HEADPyListObject是变长对象 2. PyObject **ob_item;指向列表元素的指针数组, list[0] 即 ob_item[0] 3. Py_ssize_t allocated;allocated列表分配的空间, ob_size为已使用的空间allocated 总的申请到的内存数量ob_size 实际使用内存数量 等式: 0 |
结构
构造
只有一个方法
定义如下
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | 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 // 大小为负数, return if (size 0) { PyErr_BadInternalCall(); return NULL; } // 如果大小超过, 报错 /* Check for overflow without an actual overflow, * which can cause compiler to optimise out */ if ((size_t)size > PY_SIZE_MAX / sizeof(PyObject *)) return PyErr_NoMemory(); // 计算需要的字节数(PyObject指针数组) nbytes = size * sizeof(PyObject *); // 如果缓冲池非空, 从缓冲池取 if (numfree) { // 取缓冲池数组最后一个对象 numfree—; op = free_list[numfree]; // set refcnt=1 _Py_NewReference((PyObject *)op);#ifdef SHOW_ALLOC_COUNT count_reuse++;#endif } else { // 否则, GC_New分配内存空间 op = PyObject_GC_New(PyListObject, &PyList_Type); // 分配失败 if (op == NULL) return NULL;#ifdef SHOW_ALLOC_COUNT count_allocn class=\”crayon-st\”>return NULL;#ifdef SHOW_ALLOC_COUNT count_allocde/listobject.h | Objects/listobject.c 定义
说明
结构 构造只有一个方法 定义如下
|