Is it a linked list, an array? I searched around and only found people guessing. My C knowledge isn\'t good enough to look at the source code.
I would suggest Laurent Luce's article "Python list implementation". Was really useful for me because the author explains how the list is implemented in CPython and uses excellent diagrams for this purpose.
List object C structure
A list object in CPython is represented by the following C structure.
ob_itemis a list of pointers to the list elements. allocated is the number of slots allocated in memory.typedef struct { PyObject_VAR_HEAD PyObject **ob_item; Py_ssize_t allocated; } PyListObject;It is important to notice the difference between allocated slots and the size of the list. The size of a list is the same as
len(l). The number of allocated slots is what has been allocated in memory. Often, you will see that allocated can be greater than size. This is to avoid needing callingrealloceach time a new elements is appended to the list.
...
Append
We append an integer to the list:
l.append(1). What happens?
We continue by adding one more element:
l.append(2).list_resizeis called with n+1 = 2 but because the allocated size is 4, there is no need to allocate more memory. Same thing happens when we add 2 more integers:l.append(3),l.append(4). The following diagram shows what we have so far.
...
Insert
Let’s insert a new integer (5) at position 1:
l.insert(1,5)and look at what happens internally.
...
Pop
When you pop the last element:
l.pop(),listpop()is called.list_resizeis called insidelistpop()and if the new size is less than half of the allocated size then the list is shrunk.You can observe that slot 4 still points to the integer but the important thing is the size of the list which is now 4. Let’s pop one more element. In
list_resize(), size – 1 = 4 – 1 = 3 is less than half of the allocated slots so the list is shrunk to 6 slots and the new size of the list is now 3.You can observe that slot 3 and 4 still point to some integers but the important thing is the size of the list which is now 3.
...
Remove Python list object has a method to remove a specific element:
l.remove(5).