Le code C est assez simple, en fait. En augmentant une macro et en supprimant quelques commentaires non pertinents, la structure de base est la suivante listobject.h
qui définit une liste comme suit :
typedef struct {
PyObject_HEAD
Py_ssize_t ob_size;
/* 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
*/
Py_ssize_t allocated;
} PyListObject;
PyObject_HEAD
contient un nombre de références et un identifiant de type. Donc, c'est un vecteur/rayon qui sur-alloue. Le code pour redimensionner un tel tableau quand il est plein est dans listobject.c
. Il ne double pas réellement le tableau, mais le fait croître en allouant
new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
new_allocated += newsize;
à la capacité à chaque fois, où newsize
est la taille demandée (pas nécessairement allocated + 1
parce que vous pouvez extend
par un nombre arbitraire d'éléments au lieu de append
en les prenant un par un).
Voir aussi le FAQ Python .
0 votes
Selon les docs Les listes Python ne sont pas des listes liées. Ce sont des tableaux de taille variable. Elles sont également mutables. Je ne suis pas sûr qu'il implémente vraiment une capacité logique et une capacité réelle (ce qui en ferait une liste complète). réseau dynamique . On peut donc dire que c'est une structure de données unique en son genre. (Même si je crois vraiment que c'est un tableau dynamique).