Согласно исходному коду (dict_items(PyDictObject *mp)
) выделен список из n (размер # пар ключ / значение в словаре) и для каждого элемента, отличного от нуля (строка 2278 : if (value != NULL)
), оно установлено в соответствующем индексе списка кортежей.
Сам объект python - это, по сути, кусок памяти, который знает размер каждого объекта (offset
), где начинаются значения (value_ptr
) и где находятся ключи (ep
). Поэтому, когда вы получаете ключи / значения (for k,v in object
), он в основном делал полный обход использованной части выделенной памяти для объекта.
Кстати, это может помочь узнать, что PyList_SET_ITEM - это просто макрос для установки значения в массиве по его желаемому индексу: #define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item\[i\] = (v))
. Поскольку массивы - это просто значения, хранящиеся последовательно в памяти, оператор индекса знает, как разместить значение в ячейке памяти start + (sizeOf(object)*index)
.
Отказ от ответственности: это первый раз, когда я пытался прочитать исходный код Python, поэтому моя интерпретация может быть немного неправильной или упрощенной.