Всегда ли выполняется итерация по одному и тому же морозильному устройству для производства предметов в одном и том же порядке?(Python 3) - PullRequest
0 голосов
/ 12 октября 2018

Например, когда я выполняю frozen = frozenset(('kay', 'snow queen')), тогда tuple(frozen), я получаю ('kay', 'snow queen').(Когда и как) возможно ли, если вообще когда-либо, iter(frozen) производить предметы в другом порядке?(Когда и как) tuple(frozen) вернет ('snow queen', 'kay')?

Я использую Python 3 почти все время, но мне также было бы интересно узнать о Python 2.

1 Ответ

0 голосов
/ 12 октября 2018

По умолчанию хеш-значения объектов str подсчитываются с непредсказуемым случайным значением.Хотя они остаются постоянными в рамках отдельного процесса Python, они не предсказуемы между повторными вызовами Python.Изменение значений хеш-функции влияет на порядок итераций множеств.

Итак, при включенной рандомизации хеша вы получите элементы в другом порядке:

$ for i in {1..10}; do python3 -c "frozen = frozenset(('kay', 'snow queen')); print(list(frozen))"; done
['snow queen', 'kay']
['snow queen', 'kay']
['snow queen', 'kay']
['snow queen', 'kay']
['kay', 'snow queen']
['kay', 'snow queen']
['snow queen', 'kay']
['kay', 'snow queen']
['snow queen', 'kay']
['snow queen', 'kay']

Если вы отключите его , вы получите повторяемый, но произвольныйorder:

$ export PYTHONHASHSEED=0
$ for i in {1..10}; do python3 -c "frozen = frozenset(('kay', 'snow queen')); print(list(frozen))"; done
['kay', 'snow queen']
['kay', 'snow queen']
['kay', 'snow queen']
['kay', 'snow queen']
['kay', 'snow queen']
['kay', 'snow queen']
['kay', 'snow queen']
['kay', 'snow queen']
['kay', 'snow queen']
['kay', 'snow queen']

Начиная с Python 3.3, рандомизация хэшей по умолчанию включена до Обходной уязвимость безопасности .

См. также: переключатель -Rпереводчику .

...