python - set.pop() 是确定性的吗?

标签 python set

我知道 python 集合的元素是无序的。调用pop方法返回一个任意元素;我没意见。

我想知道的是,当集合具有相同的历史记录时,pop 是否总是返回相同的元素。当然,在一个版本的 python 中,我不介意 python 的不同版本/实现是否做他们自己的事情。特别是,我问的是 python 2.7。在这种情况下,实现比 api 更重要。

我在游戏的程序地牢生成器中大量使用集合,我希望给定种子的结果是确定性的。

最佳答案

一般来说,答案是否。 @Christophe 和@Marcin (un) 有帮助地指向的 python 源代码显示,元素按照它们在哈希表中出现的顺序弹出。因此,弹出顺序(可能还有迭代顺序) 是确定性的,但仅适用于固定 哈希值。 根据 __hash__ 文档中的注意,数字是这种情况,但字符串不是 ,顺便说一下,它也直接涉及到您的问题:

Note by default the hash() values of str, bytes and datetime objects are “salted” with an unpredictable random value. Although they remain constant within an individual Python process, they are not predictable between repeated invocations of Python.

[ ... ]

Changing hash values affects the iteration order of dicts, sets and other mappings. Python has never made guarantees about this ordering (and it typically varies between 32-bit and 64-bit builds).

编辑正如@Marcin 指出的那样,我引用的链接不适用于 Python 2。 哈希随机化 became the default with Python 3.3.默认情况下,Python 2.7 没有故意进行非确定性字符串哈希。

一般来说,对于哈希不是其值的可重复函数的任何对象(例如,如果哈希基于内存地址),这都是一个问题。但相反,如果您为集合中的对象定义自己的 __hash__ 方法,您可以预期它们将以可重现的顺序返回。 (前提是集合的历史记录和平台保持固定)。

关于python - set.pop() 是确定性的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64782346/

相关文章:

python - 如何在 python 中遍历大型数据集而不会出现 MemoryError?

python - 混合 Web 应用程序中的 RESTful 身份验证

python - datetime.fromtimestamp vs datetime.utcfromtimestamp,哪个使用起来更安全?

python - 如何使用jinja2宏修改css类

java - 使用具有一个类的集合但使用字符串查找

postgresql - 在函数postgres中分配参数

java - 如何组合这些 Set<?为我的 API 扩展 Vector> 过滤函数?

python - 如何使用 python 从 S3 存储桶读取 .txt 文件并查看内容?

java - java中字符串数字的排序

delphi - 如何使用 RTTI 检查或更改存在哪些集合元素?