

不同的编程语言有不同的数据类型,python的列表可以说是最好用的一种数据结构,它可以改变长度,可以存储不同的数据类型,可以增、插、改、删,并且可以复制,也可以获得切片,可以说用过python列表之后再用其他类似的数据结构都会感觉不如它好用。既然列表这么好用,那么想知道它是怎么实现的吗?接下来让我们了解一下它的底层实现。
先查看一下列表的cpython源码。
typedef struct {PyObject_VAR_HEADPyObject **ob_item;Py_ssize_t allocated;} PyListObject;
列表只有3个字段,其中PyObject_VAR_HEAD是一个包含引用个数、类型、额外数据个数的预定义头,allocated是内存收集的个数,ob_item是一个二级指针。我们发现列表是一个二级指针,先指向一片连续的内存,这片内存大小是allocated个乘以PyObject*的空间大小,这片空间再指向一个一个对象,内存布局是这样。

有了列表的内存布局之后,我们就可以明白很多操作了,现在理解我们经常使用的增、删、改、插这些操作。首先是增,增加元素首先要判断ob_item指向的连续内存够不够,如果不够,就要增加该片内存,python增加内存往往会多增加一些,有了足够的内存,在后面追加新元素,删除元素会麻烦一点,画个图理解一下。

既然我们明白了好用的列表是如何实现的,那么就要有一些感想,列表删除和插入数据是很麻烦的一件事情,所以要避免频繁删除和插入数据,对于经常需要改变和增加数据的数据类型可以考虑使用列表。