Питон 2
Наборы — это наборы неупорядоченных значений. Если я создаю набор через литерал набора, например.
s = {'a', 'b', 'c'}
а затем распечатать, я получаю элементы в каком-то перемешанном порядке. Однако кажется, что в Python 2.7 приведенный выше пример всегда приводит к одному и тому же порядку:
print(s) # set(['a', 'c', 'b']) in Python 2.7
Как Python 2.7 решает этот порядок? Даже хэши 'a'
, 'b'
и 'c'
не в том порядке, в котором они были созданы.
Питон 3
В Python 3.x (включая 3.6, где dict
ключей упорядочены) результирующий порядок кажется случайным, хотя всегда одинаковым в данном процессе Python. То есть повторное построение заданного литерала всегда приводит к одному и тому же порядку, пока я не перезапущу интерпретатор Python.
Чтобы проверить порядок в нескольких процессах Python, рассмотрите код bash
(for _ in {1..50}; do python3 -c "s = {'a', 'b', 'c'}; print(s)"; done) | sort -u
Это (чаще всего) покажет 6 различных способов расположения 3 элементов. Заменяя python3
на python
(2), мы видим только порядок ['a', 'c', 'b']
. Что определяет порядок в Python 3?
Я вижу, что значение hash
объектов является детерминированным в Python 2, в то время как случайное (хотя и постоянное в процессе Python) в Python 3. Я уверен, что это ключ к полному объяснению.
Редактировать
Как пишет deceze в своем комментарии, я хотел бы знать, делает ли Python что-то явно только для достижения этой рандомизации, или это происходит «бесплатно».