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

2024-03-18

我知道 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(使用前将#替换为@)

set.pop() 是确定性的吗? 的相关文章

随机推荐

  • Asp.net 图像大小调整质量

    我有这段代码 用于调整和保存用户发布的文件的大小 问题是 当我调整到 480px 宽度时 图像质量会下降很多 而且大小 以 kb 为单位 仍然很大 例如 当我使用 Paint 之类的软件 手动 将同一图像的大小调整为 480px 时 质量仍
  • 如何在全日历中将事件的背景颜色更改为不同的颜色?

    我正在使用最新版本fullcalendar 我查看了文档如何更改背景颜色事件 但我不知道如何处理不同的事件 我需要带有红色 蓝色 绿色事件的代码示例 如下图所示 我在文档网站上看到了这段代码 但我无法应用两种颜色 calendar full
  • 在 check_box_tag 的 onclick 函数中传递 Rails 变量

    我正在使用 Rails 3 0 在我看来 我试图拥有一个每行都有一个复选框的表 以及一个带有特定参数 rails 变量 的 onclick 事件函数 table tr td gt td tr table 我尝试了很多方法 但没有成功 我知道
  • 使用 slick 3.0.0 流结果和 Postgresql 的正确方法是什么?

    我正在尝试弄清楚如何使用流畅的流媒体 我使用 slick 3 0 0 和 postgres 驱动程序 情况如下 服务器必须向客户端提供按大小 以字节为单位 限制的数据块分割的数据序列 因此 我编写了以下巧妙的查询 val sequences
  • 获取 Jenkins Pipeline 插件中工作区目录的绝对路径

    我目前正在对 Jenkins Pipeline 插件 以前称为 Workflow 插件 进行一些评估 阅读文档我发现我目前无法使用以下命令检索工作区路径env WORKSPACE 目前 以下变量在工作流程脚本中不可用 节点标签 工作空间 S
  • 使用 .NET RegEx 检索第二个“-”之后的字符串部分

    这是我的第一条堆栈消息 希望你能帮忙 我有几个字符串需要分解以供以后使用 这里有几个例子来说明我的意思 fred 064528 NEEDED frederic 84728957 NEEDED sam 028 NEEDED 正如您在上面看到的
  • 有没有办法跨模块使用局部变量?

    我有一个带有模块和用户窗体的 VBA 项目 我想在我的用户表单中使用模块中的一些变量 我是否有必要在全局声明这些变量 我不喜欢全局变量 因为它们在代码执行后保留在内存中 并且我必须在宏开始时一一重置这些变量 我无法使用关键字 End 从内存
  • 电子邮件中的 Message-ID 有什么用?

    据我所知 每个消息 ID 都必须是唯一的 但是如果我们强制标头具有固定值 则可能会创建重复的消息 ID 所以我不明白他们说 Message ID 应该是唯一的有什么意义 但他们很容易创建重复项 如果任何有一点阅读和基本编程知识的人都可以轻松
  • 使用 Keras 加载之前保存的重新训练的 VGG16 模型时出现 ValueError

    我在 Keras 中使用 VGG16 架构 我通过以下方式对其进行了重新训练以满足我的需求 vgg16 model keras applications vgg16 VGG16 model Sequential for layer in v
  • CUDA:如何直接在GPU上使用thrust::sort_by_key? [复制]

    这个问题在这里已经有答案了 Thrust 库可用于对数据进行排序 该调用可能如下所示 带有键和值向量 thrust sort by key d keys begin d keys end d values begin 在 CPU 上调用 d
  • Azure DevOps 服务连接到 B2C 租户?

    我正在尝试建立从 Azure DevOps 到我的 Azure B2C 租户的服务连接 但遇到了问题 我开始认为这是不可能的 我与主 Azure 订阅 租户有多个服务连接 但特别想要与我的 B2C 租户建立连接 以便我可以使用 Terraf
  • 禁用复制构造函数

    我有一堂课 class SymbolIndexer protected SymbolIndexer public static inline SymbolIndexer GetUniqueInstance static SymbolInde
  • 如何从javascript中的回调函数中获取完整数据

    我编写了以下函数 它从 url 获取 json 数据 function getWeatherDataForCities cityArray var arrAllrecords var toDaysTimestamp Math round n
  • 将(可选)参数传递给 HTTP 参数(Python、请求)

    我目前正在开发 API 包装器 并且在将参数从函数传递到请求的有效负载中时遇到问题 参数可以是 blockId senderId recipientId limit offset orderBy 所有参数均通过 OR 连接 一个可能的解决方
  • 在 Rails 中使用 Turbolinks link_to

    只是想知道是否有一种方法可以直接在 Rails link to 帮助程序中使用 Turbolinks 快速的谷歌搜索没有发现任何值得注意的东西 这是我尝试过但无济于事的类型 我知道你可以通过像这样的常规链接来做到这一点 a href gir
  • 为什么使用 twitter bootstrap 的多模式会出现过多递归错误?

    我尝试在另一个模态中包含一个模态 但是 我收到了类似的错误too much recursion在火狐浏览器中 我使用了最新的 jQuery 和 Twitter bootstrap 但仍然有这个问题 这里是plunker http plnkr
  • Windows 服务托管 TCP WCF 服务

    我正在尝试在 Windows 2008 R2 服务器上托管 WCF 服务作为 Windows 服务 我按照 msdn 提供的指示进行操作 在这里找到 http msdn microsoft com en us library ff64981
  • 如何在不创建用户帐户的情况下只允许每人(电脑/手机)对网站上的 1 个帖子投 1 票?

    在学习 Meteor 框架的过程中 我正在将 Yik Yak 移动应用程序重新创建为 Web 应用程序 但该应用程序是完全匿名的 没有用户帐户 但您仍然只能对帖子投赞成票或反对票一次 如何使这项工作有效 您想要的可能不仅仅需要 JavaSc
  • 网格视图数据绑定事件

    如何使用网格视图的数据绑定事件以及如何调用它有人可以详细说明一下吗 我像这样在按钮上绑定 gridview DataTable dt placedStudentManager GetPlacedStudentList sb passoutY
  • set.pop() 是确定性的吗?

    我知道 python 集合的元素是没有顺序的 调用pop方法返回任意元素 我对此很满意 我想知道当集合具有相同的历史记录时 pop 是否总是返回相同的元素 当然 在一个版本的 python 中 我不介意 python 的不同版本 实现是否做