`
jinvasshole
  • 浏览: 769931 次
文章分类
社区版块
存档分类
最新评论

【Python旧时笔记 四】PyListObject对象

 
阅读更多
在listobject.h中,有如下定义和注释:

typedefstruct{
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_tallocated;
}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 今夜打篮球,早点休息
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics