Python列表的底层数据结构是什么?

Python列表的底层数据结构是什么?,python,list,data-structures,Python,List,Data Structures,用于实现Python内置列表数据类型的典型底层数据结构是什么?CPython: 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

用于实现Python内置列表数据类型的典型底层数据结构是什么?

CPython:

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;
在中,它是一个
数组列表

列表对象实现为 数组。它们经过优化以实现快速响应 定长运算与O(n) pop(0)和的内存移动成本 插入更改的(0,v)操作 无论是尺寸还是位置 底层数据表示

另见:

顺便说一句,关于数据结构的Python教程建议使用pop(0)来模拟队列,但没有提到O(n)或deque选项,这很有趣


尽管这可能很明显,但值得一提的是Python列表是动态数组(与静态数组相反)。这是求职面试问题/学术界出现的一个重要区别

由于数组是动态的,Python在声明时会保留一定数量的内存,例如:

somelist = []

由于已经留出了额外的内存,执行
somelist.append()
只需写入下一个保留内存插槽,因此在大多数情况下是
O(1)
。对于静态数组,通常数组已满(即,如果有4个字节,则数组大小为4),并且附加值总是
O(n)
,因为它们需要保留一组全新的内存(现在可能有5个字节)并复制内容。

两个选项:1)只是好奇,还有人问我这个问题,我告诉他们我的直觉是实现是基于阵列的,但我不确定。信不信由你,我确实花了几分钟在谷歌上搜索答案,即使我下载了源代码,我可能也不知道从哪里开始。我想这里的人只要稍加努力就能知道答案,看来我是对的。对他们来说简单的代表,对我来说快速的回答,每个人都赢。这一点都不傻。Python列表包含append()操作而不包含prepend()的全部原因操作的原因正是Guido等人。他们认为列表用户需要非常明确地意识到这样一个事实,即它是一个数组,在数组中添加内容很容易且有效,但预先添加内容却非常昂贵。可能的教程副本早在deque模块出现之前就已经存在,这就是为什么。如果可能的话,向bugs.python.org报告,并为正确的句子提供补丁,教程将不再给出错误的提示。在几次采访中,我被告知列表的底层数据结构是链表。对吗?在这种情况下,对于字典来说,它也是链表。是这样吗?
somelist = []