在listobject.h中,有如下定义和注释:
JasonLee 2011.08.08 22:32 牙疼,犯困,早点休息
JasonLee 2011.08.10 23:54 今夜打篮球,早点休息
typedef struct { PyObject_VAR_HEAD /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ PyObject **ob_item; /* ob_item contains space for 'allocated' elements. The number * currently in use is ob_size. * Invariants: * 0 <= ob_size <= allocated * len(list) == ob_size * ob_item == NULL implies ob_size == allocated == 0 * list.sort() temporarily sets allocated to -1 to detect mutations. * * Items must normally not be NULL, except during construction when * the list is not yet visible outside the function that builds it. */ Py_ssize_t allocated; } PyListObject;
PyListObject是个可变对象,可以在运行时改变负责维护的内存,包括自身的长度和所包含元素的内容。
其中,成员ob_item指向存放元素的内存空间,allocated表示一共分配得到的可以存放元素的数目,
而头部宏中包含的ob_size表示包含的有效元素的数目,因为PyListObject并不是要插入一个元素才申请一次空间的,而是一次性先申请一定数目的空间,即allocated。
需要考察第一次创建过程,以及当表满了后,新增元素的处理。
JasonLee 2011.08.08 22:32 牙疼,犯困,早点休息
Python中使用PyList_New来创建新的PyListObject对象,在创建过程中会使用缓冲池的对象或者新建。
缓冲池的对象由不再使用的PyListObject构成,可以理解为“废物利用”或者“环保重用”。
使用PyList_SetItem来设置PyListObject中某一元素的值。
使用PyList_Insert进行插入,实际上调用的ins1函数,过程会调用到list_resize函数调整大小,类似的还有listappend和listremove函数等。
插入、删除等操作会涉及内存移动。
JasonLee 2011.08.10 23:54 今夜打篮球,早点休息