1Python列表【底层|原理|剖析】
1.创建列表
结构体
1 | typedef struct{ |
创建list
1 | PyObject * |
2.添加元素
list中插入一个元素时,扩容连续的内存地址(容量),在内存创建需要插入的内容p,将地址*p放入list的空间中,所以,yListObject的ob_item是指针的指针
扩容的曲线一般就是0,4,8,16,24…
1 | // 添加元素 |
扩容
1 | // 扩容机制 |
3.插入元素
1 | name_list = [] |
4.移除元素
list.pop()
删除最后一个元素只需要修改size,不需要清除数据,下次append可以直接覆盖这个位置指定索引位置移除后,向前补位
1 | static PyObject * |
5.清空元素
list.clear()
1 | static int |
6.销毁列表
del list
- 销毁列表对象的操作
- 将列表的引用计数-1
- 引用计数>0,还有应用的话不做操作
- 引用计数=0,没人使用
- 处理列表的元素,将所有引用计数-1(GC回收0计数)
- ob_item=0,ob_size=0,ob_allocated=0
- 将列表从双向链表移除,可以销毁
- 为了提高效率,Python结束期在内部为free_list缓存80个list,存放无使用的list,再创建的时候直接从缓存中拿来初始化。如果已经存了80个,del 的时候直接在内存中销毁对象
1 | static void |
创建列表时,实际上不会直接开辟内存,而是先看看free_list
1 | a = [1, 2, 3] |