python - 迭代相同的 freezeset 是否保证始终以相同的顺序生成项目? (Python 3)

标签 python iterator set persistent-storage reliability

例如,当我执行 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 .

另请参阅:the -R switch to the interpreter .

关于python - 迭代相同的 freezeset 是否保证始终以相同的顺序生成项目? (Python 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52768966/

相关文章:

python - 使用 PyInstaller (Python 2) 后为 "ImportError: cannot import name _imaging"

c++ - Const 方法和自定义迭代器

javascript - Angular : how to iterate through all indices in an array except the final index using ng-repeat

使用生成器和迭代器时,Python 多循环失败

python - Set 与 DAWG 在 Python 中检查字典中的成员资格

Java:HashMap 声称它有 key ,但不知何故没有

python - 将一个列表转换为集合,但如果为空,则使用默认列表

python - 强制命令打开时 paramiko 不起作用

python - 修改 Dijkstra 算法以获得最少的变化

python - 在公司内网上使用 Django 网站