例如,当我执行 frozen = freezeset(('kay', 'snow queen'))
,然后执行 tuple(frozen)
时,我得到 ('凯','雪之女王')
。 (何时/如何)iter(frozen) 是否有可能(如果有的话)以不同的顺序生成项目? (何时/如何)tuple(frozen)
将返回 ('snow queen', 'kay')
?
我几乎一直在使用 Python 3,但我也对 Python 2 感到好奇。
最佳答案
默认情况下,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']
如果您disable it ,您将得到一个可重复但任意的顺序:
$ 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 起,哈希随机化默认启用为 workaround a security vulnerability .
关于python - 迭代相同的 freezeset 是否保证始终以相同的顺序生成项目? (Python 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52768966/