🖥 Как происходит инициалиация list в CPython ?



Ответ



Объект списка в CPython представлен нижеследующей структурой в C. ob_item — это список указателей на элементы списка, allocated — количество выделенной памяти.



typedef struct {

PyObject_VAR_HEAD

PyObject **ob_item;

Py_ssize_t allocated;

} PyListObject;






Инициализация списка



Давайте посмотрим, что происходит при создании пустого списка, к примеру l = []. Вызывается функция PyList_New(0):



/*

size - размер списка

*/

PyList_New(Py_ssize_t size)

{

// Вычисляется реальный размер необходимой памяти

nbytes = size * sizeof(PyObject *);



// Инициализируется ob_item

if (size <= 0)

op->ob_item = NULL;

else {

op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);

memset(op->ob_item, 0, nbytes);

}



// Сохраняется количество выделенных ячеек

op->allocated = size;



return (PyObject *) op;

}






Важно понимать разницу между выделенной памятью и размером списка. Размер списка — это тоже самое, что и len(l). allocated — это количество выделенной памяти, которое зачастую может быть больше размера списка. Это делается для предотвращения вызовов realloc при каждом добавлении элементов.





@python_job_interview