Python 中的列表异常强大年夜,看看它的内部实现机制是怎么样的,必定异常有趣。
下面是一段 Python 脚本,在列表中添加几个整数,然后打印列表。
- >>> l = []
- >>> l.append(1)
- >>> l.append(2)
- >>> l.append(3)
- >>> l
- [1, 2, 3]
- >>> for e in l:
- ... print e
- ...
- 1
- 2
- 3
可以发明,列表是一个迭代器。
列表对象的 C 说话构造体
Cpython 中的列表实现类似于下面的 C 构造体。ob_item 是指向列表对象的指针数组。allocated 是申请内存的槽的个数。
- typedef struct {
- PyObject_VAR_HEAD
- PyObject **ob_item;
- Py_ssize_t allocated;
- } PyListObject;
列表初始化
看看初始化一个空列表的时刻产生了什么,例如:l = []。
- arguments: size of the list = 0
- returns: list object = []
- PyListNew:
- nbytes = size * size of global Python object = 0
- allocate new list object
- allocate list of pointers (ob_item) of size nbytes = 0
- clear ob_item
- set list's allocated var to 0 = 0 slots
- return list object
在列表偏移量 1 的地位插入新元素,整数 5:l.insert(1,5),内部调用ins1() 函数。
要分清列表大年夜小和分派的槽大年夜小,这很重要。列表的大年夜小和 len(l) 的大年夜小雷同。分派槽的大年夜小是指已经在内存平分派了的槽空间数。平日分派的槽的大年夜小要大年夜于列表大年夜小,这是为了避免每次列表添加元素的时刻都调用分派内存的函数。下面会具体介绍。
Append 操作
向列表添加一个整数:l.append(1) 时产生了什么?调用了底层的 C 函数 app1()。
- arguments: list object, new element
- returns: 0 if OK, -1 if not
推荐阅读
比来进修了一点收集爬虫,并实现了应用Python来爬取知乎的一些功能,这里做一个小的总结。收集爬虫是指经由过程必定的规矩主动的大年夜网上抓取一些信息的法度榜样或脚本。我们知道机械进>>>详细阅读
本文标题:深入Python列表的内部实现
地址:http://www.17bianji.com/lsqh/35408.html
1/2 1