Python2 архивы неупорядочены;порядок зависит от значений хеш-ключей, как объяснено в этом великом ответе Мартина Питерса.Я не думаю, что вы можете использовать dict здесь, но вы можете использовать OrderedDict
(требуется Python 2.7 или выше), который поддерживает порядок ключей.Например,
from collections import OrderedDict
data = [('b', 0), ('a', 0)]
d = dict(data)
od = OrderedDict(data)
print(d)
print(od)
#{'a': 0, 'b': 0}
#OrderedDict([('b', 0), ('a', 0)])
Вы можете выбрать OrderedDict так, как если бы вы выбрали его, но порядок будет сохранен, и результирующая строка будет такой же при выборе одинаковых объектов.
from collections import OrderedDict
import pickle
data = [('a', 1), ('b', 2)]
od = OrderedDict(data)
s = pickle.dumps(od)
print(s)
Обратите внимание, что вы не должны передавать dict в конструкторе OrderedDict
, так как ключи уже были бы помещены.Если у вас есть словарь, вы должны сначала преобразовать его в кортежи с нужным порядком.OrderedDict является подклассом dict и имеет все методы dict, поэтому вы можете создать пустой объект и назначить новые ключи.
Ваш тест не проходит, потому что вы используете ту же версию Python и те же условия - порядок словаря не будет меняться случайным образом между итерациями цикла.Но мы можем продемонстрировать, как ваш код не может генерировать разные строки, когда мы меняем порядок ключей в словаре.
import pickle
initial = pickle.dumps({'a': 1, 'b': 2})
assert pickle.dumps({'b': 2, 'a': 1}) != initial
Результирующая строка должна отличаться, когда мы сначала ставим ключ 'b' (он будет другим в Python> = 3.6), но в Python2 это то же самое, потому что ключ 'a' помещается перед ключом«б».
Чтобы ответить на ваш главный вопрос, словари Python2 не упорядочены, но словарь, вероятно, будет иметь тот же порядок при использовании того же кода и версии Python.Однако этот порядок может не совпадать с порядком, в котором вы поместили элементы в словарь.Если порядок важен, лучше использовать OrderedDict или обновить версию Python.