源码位置 Include/listobject.h |
Objects/listobject.c
定义
1 2 3 4 5 6 7 |
typedef struct { PyObject_VAR_HEAD PyObject **ob_item; Py_ssize_t allocated; } PyListObject; |
说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
1. PyObject_VAR_HEAD PyListObject是变长对象 2. PyObject **ob_item; 指向列表元素的指针数组, list[0] 即 ob_item[0] 3. Py_ssize_t allocated; allocated列表分配的空间, ob_size为已使用的空间 allocated 总的申请到的内存数量 ob_size 实际使用内存数量 等式: 0 |
结构
构造
只有一个方法
定义如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
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 定义
说明
结构 构造只有一个方法 定义如下
|