Краткий ответ
Dicts реализованы в виде ha sh таблиц , а не стеков.
Без дополнительных мер, которые приводят к шифрованию порядок ключей
Ха sh Таблицы
До Python 3.6 порядок в словаре был рандомизирован функцией ha sh. Грубо говоря, вот как это работает:
d = {} # Make a new dictionary
# Internally 8 buckets are formed:
# [ [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] ]
d['a'] = 10 # hash('a') % s gives perhaps bucket 5:
# [ [ ] [ ] [ ] [ ] [ ] [('a', 10)] [ ] [ ] ]
d['b'] = 20 # hash('b') % s gives perhaps bucket 2:
# [ [ ] [ ] [('b', 20)] [ ] [ ] [('a', 10)] [ ] [ ] ]
Итак, вы можете видеть, что упорядочение этого dict поставит 'b'
перед 'a'
, потому что функция ha sh помещает 'b'
в более раннее ведро. .
Более новые таблицы ha sh, которые помнят порядок вставки
Начиная с Python 3.6, также был добавлен стек. См. Это подтверждение концепции для лучшего понимания того, как это работает.
Соответственно, dicts начал запоминать порядок вставки, и это поведение стало гарантированным в Python 3.7 и более поздних версиях.
Используйте OrderedDict в более старых Python реализациях
До версии 3.7 вы можете использовать collection.OrderedDict () , чтобы получить тот же эффект.
Более глубокое погружение
Для тех, кто хочет узнать больше о том, как это работает, у меня есть 37 минутное видео , которое показывает из первых принципов все методы, используемые для создания современных Python словарей.