Python列表的底层数据结构是什么?
用于实现Python内置列表数据类型的典型底层数据结构是什么?CPython: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
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 = []