Порядок ключей в словаре в питоне
В Python 3.6 была оптимизирована память, используемая dict
.
Раньше элементы хранились в массиве, каждый элемент — структура из хэша и ссылок на ключ и на значение. Поскольку используется открытая адресация, то многие ячейки были пусты и прорва памяти тратилась зря.
В новой реализации в основном массиве хранится только индекс, а хэши и указатели хранятся в отдельном списке. За счет этого размер заполненной и пустой ячейки будут одинаковыми, а список с полезной нагрузкой почти всегда плотно заполненным (при удалении там остается заглушка, чтобы список за линейное время не двигать).
Один из побочных эффектов — ключи становятся упорядочены в порядке добавления (в 3.7 это закрепили на уровне требования). С одной стороны — прикольно, но с другой, когда читаешь код, который на это полагается, то так можно и с ума начать сходить (“почему в хэш-таблице ключи отсортированы?!”). Для читаемости лучше все-таки явно OrderedDict использовать.