暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

列表底层实现

与C同行 2022-08-07
968


不同的编程语言有不同的数据类型,python的列表可以说是最好用的一种数据结构,它可以改变长度,可以存储不同的数据类型,可以增、插、改、删,并且可以复制,也可以获得切片,可以说用过python列表之后再用其他类似的数据结构都会感觉不如它好用。既然列表这么好用,那么想知道它是怎么实现的吗?接下来让我们了解一下它的底层实现。

先查看一下列表的cpython源码。


    typedef struct {
    PyObject_VAR_HEAD
    PyObject **ob_item;
        Py_ssize_t allocated;
    } PyListObject;

    列表只有3个字段,其中PyObject_VAR_HEAD是一个包含引用个数、类型、额外数据个数的预定义头,allocated是内存收集的个数,ob_item是一个二级指针。我们发现列表是一个二级指针,先指向一片连续的内存,这片内存大小是allocated个乘以PyObject*的空间大小,这片空间再指向一个一个对象,内存布局是这样。

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

    删除某个数据一般需要移动删除对象后面所有的对象向前,改就很简单了,直接用二级指针指向新的对象就好,插和删比较类似,插数据需要判断是否需要增加内存,然后将插入索引后面的数据向后移动一下,最后在指定位置插入新数据。

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


    文章转载自与C同行,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论