[笔记]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     今夜打篮球,早点休息
目录
相关文章
|
4月前
|
安全 C++ 容器
C++零基础教程(引用)
C++零基础教程(引用)
38 0
|
4月前
|
存储 安全 编译器
C++入门:引用是什么
C++入门:引用是什么
|
4月前
|
编译器 C语言 C++
|
4月前
|
安全 Java 编译器
|
5月前
|
存储 前端开发 rax
【C++】C++入门 引用详解 带你由浅入深理解引用
【C++】C++入门 引用详解 带你由浅入深理解引用
|
8月前
|
存储 安全 编译器
C++引用(&)笔记
C++引用(&)笔记
61 0
|
11月前
对象和类的知识点总结
对象和类的知识点总结
59 0
|
12月前
|
存储 安全 C++
C++ 类 & 对象初学者学习笔记
面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。
73 0
|
Python
Python编程:获取类实例对象的元素
Python编程:获取类实例对象的元素
167 0
|
存储 开发者 Python
对象介绍|学习笔记
快速学习 对象介绍