[笔记]PyListObject对象

在listobject.h中,有如下定义和注释:
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     今夜打篮球,早点休息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值