我知道 python 集合的元素是没有顺序的。调用pop方法返回任意元素;我对此很满意。
我想知道当集合具有相同的历史记录时,pop 是否总是返回相同的元素。当然,在一个版本的 python 中,我不介意 python 的不同版本/实现是否做自己的事情。特别是,我问的是 python 2.7。在这种情况下,更多的是实现问题,而不是 api 问题。
我在游戏的程序地下城生成器中经常使用集合,并且我希望结果对于给定的种子是确定的。
答案一般是no.@Christophe 和 @Marcin(无)帮助指出的 python 源代码显示元素按照它们在哈希表中出现的顺序弹出。因此,弹出顺序(大概还有迭代顺序)is确定性的,但仅适用于fixed哈希值。
数字就是这样,但是not对于字符串,根据Note在文档中__hash__ https://docs.python.org/3.5/reference/datamodel.html#object.__hash__,顺便说一句,这也直接触及你的问题:
注意默认情况下hashstr、bytes 和 datetime 对象的 () 值使用不可预测的随机值“加盐”。尽管它们在单个 Python 进程中保持不变,但在 Python 的重复调用之间它们是不可预测的。
[ ... ]
更改哈希值会影响字典、集合和其他映射的迭代顺序。 Python 从未对这种顺序做出保证(并且它通常在 32 位和 64 位版本之间变化)。
Edit:正如 @Marcin 指出的,我引用的链接不适用于 Python 2。
哈希随机化成为 Python 3.3 的默认设置。 https://docs.python.org/3/whatsnew/3.3.html#summary-release-highlights默认情况下,Python 2.7 没有特意具有非确定性字符串哈希。
一般来说,对于散列不是其值的可重复函数的任何对象来说,这都是一个问题(例如,如果散列基于内存地址)。但相反,如果你定义自己的__hash__
方法,您可以期望它们将以可重现的顺序返回。 (前提是该系列的历史记录和平台保持固定)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)