集合中的插入顺序(解析 {} 时)[重复]

2023-11-22

有人问here为什么放的时候1 and True in a set only 1保持。

这当然是因为1==True。但在哪些情况下1被保留,在什么情况下True保持?

让我们来看看:

通过一个list建立set而不是使用set符号:

>>> set([True,1])
{True}
>>> set([1,True])
{1}

似乎合乎逻辑:set迭代内部列表,并且不添加第二个元素,因为它等于第一个元素(请注意set([True,1]) cannot yield 1, 因为set无法知道列表中的内容。它甚至可能不是一个list but an iterable)

现在使用set符号:

>>> {True,1}
{1}
>>> {1,True}
{True} 

在这种情况下,项目列表似乎是以相反的顺序处理的(在 Python 2.7 和 Python 3.4 上测试)。

但这有保证吗?或者只是一个实施细节?


语言规范似乎无法保证集合文字中元素的插入顺序。但是,Python 3.6 已更改,因此它具有预期的从左到右的计算顺序。有关此更改的完整详细信息,请参阅以下issue,还有commit这引入了插入顺序的变化。


为了更详细地描述变化,构建集合文字{True, 1}触发BUILD_SET第一次将指针推入后的操作码(oparg 等于 2)True and 1到虚拟机的内部堆栈。

在Python 3.4中,BUILD_SET使用以下循环将元素插入集合中(请注意,在我们的示例中 oparg 为 2):

while (--oparg >= 0) {
    PyObject *item = POP();
    if (err == 0)
        err = PySet_Add(set, item);
        Py_DECREF(item);

Since 1最后添加到堆栈中,它首先被弹出,并且是第一个插入到集合中的对象。

在较新版本的 Python(例如 3.6)中,BUILD_SET操作码使用PEEK代替POP:

for (i = oparg; i > 0; i--) {
    PyObject *item = PEEK(i);
    if (err == 0)
        err = PySet_Add(set, item);
        Py_DECREF(item);

PEEK(i) fetches the ith item down the stack, so for {True, 1}, the object True is added to the set first.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

集合中的插入顺序(解析 {} 时)[重复] 的相关文章

随机推荐

  • Kotlin 中是否可以重写静态方法?

    你好想象一下我们有以下课程 Manager public static void doSth some logic 如何在 kotlin 中重写该方法 我已经厌倦使用 fun Manager doSth 但它应用于实例而不是静态类型 这样做
  • 有什么方法可以仅通过类型哈希值来查找 HashSet 吗?

    我有一个结构体 除其他数据外 还有一个独特的id struct Foo id u32 other data u32 我想使用id作为键并将其保留在结构内部 use std collections HashSet use std hash H
  • 访问iOS6 UIPageViewController创建的UIPageControl?

    我正在使用一个UIPageViewController导航设置为水平 过渡样式设置为滚动 在 InterfaceBuilder 中 并且没有脊柱 这给了我一个可爱的 UIPageControl 集成 现在我希望能够切换它是否显示 因为它下面
  • 在一组固定元素上生成特定秩的“随机”矩阵

    我想生成大小的矩阵mxn和排名r 元素来自指定的有限集 例如 0 1 or 1 2 3 4 5 我希望它们在某种非常宽松的意义上是 随机 的 即我想从算法中获得各种可能的输出 其分布与具有指定等级的元素集上的所有矩阵的分布大致相似 事实上
  • 未知软件异常0xe0434352

    While I am trying to launch my application I am getting the following error 检查了应用程序日志 但没有错误消息 这是由于任何框架版本或任何其他依赖关系吗 这是 CL
  • TPL DataFlow 与 BlockingCollection

    我明白 一个BlockingCollection最适合消费者 生产者模式 但是 我什么时候使用ActionBlock来自TPL数据流图书馆 我最初的理解是对于IO操作 保留BlockingCollection而 CPU 密集型操作最适合Ac
  • 删除前 16 个字节?

    我将如何从字节数组中删除多个字节 编辑 正如 nobugz 的评论 和 Reed Copsey 的答案 提到的 如果您实际上不需要结果作为字节数组 您应该考虑使用ArraySegment
  • 具有正确重力和单行的提示和文本视图

    我打开了一个错误 但我想知道是否有人遇到此问题并知道解决方法 如果您定义一个带有提示的文本视图 请给它正确的重力 android gravity right 然后如果您定义android singleLine true或android ma
  • 在 PyQtGraph 中返回鼠标光标坐标

    我是 PyQtGraph 的新手 想用它来快速可视化我的数据采集 以前我使用 matplotlib 其中重绘图形是我的瓶颈 转换到 PyQtGraph 后 我目前只缺少 matplotlib 的一项功能 即 返回鼠标光标的 x 坐标和 y
  • ASP.NET MVC 中的模拟

    我在内联网上有一个 MVC Web 应用程序 并且希望能够在我们的 FTP 服务器上创建文件以发送给外部合作伙伴 模拟代码使用 WindowsImpersonationContext System Security Principal Wi
  • vim:搜索替换所有可写缓冲区

    so 1GvG s g 可以替换整个缓冲区 但是 假设我加载了多个 vim 缓冲区 并且我想对所有可写的缓冲区执行 s 操作 有没有办法在 vim 中做到这一点 由于我无法发表评论 因此我将重复 Brian 所说的话并添加我的 2 美分 我
  • Nodejs以数组格式追加到json文件中

    我希望nodejs按以下格式附加JSON格式的所有数据 name admin message dfd datetime 2014 06 03 13 01 39 name admin message dfd datetime 2014 06
  • Google 地图 V3 圆圈与我创建的圆圈不匹配

    我使用 Google Maps V3 API 创建了一个圆圈 并尝试制作一个具有相同半径的标记圆圈 Problem 我创建的是倾斜的 而谷歌地图创建的是一个漂亮的圆形 什么地方出了错 谷歌地图 V3 圆码 Draw search circl
  • 在R中,使用gridBase在图中嵌入子图时如何防止pdf中的空白页

    正如所解释的here 很容易将绘图嵌入到现有绘图中 这要归功于gridBase 尽管两个图都使用 R 的基本图形系统 但是 将整个图保存为 pdf 时 第一页始终为空白 如何防止这种情况发生 这是一个例子 require gridBase
  • wix 服务依赖

    我的产品有多种功能 其中包括两项服务 我们将它们称为 ServiceA 和 ServiceB 这两个服务功能都是可选的 但是 如果在安装过程中同时选择了 ServiceA 和 ServiceB 我想在它们之间创建服务依赖关系 以便 Serv
  • 无法创建 AVD 确定已禁用

    我已经安装了 eclipse juno 4 2 1 Android SDK 我创建了一个 Android 应用程序 同时创建了新的 AVD 这Ok尽管我已经确定了它的所有规格 但按钮始终处于禁用状态 这是我输入的规格 我不知道为什么 有任何
  • 代码中的 ASP.NET Core appsettings.json 更新

    我目前正在使用 asp net core v1 1 进行项目 在我的 appsettings json 中我有 AppSettings AzureConnectionKey AzureContainerName NumberOfTicks
  • 正则表达式的复杂度是多少?

    对字符串执行正则表达式比较所需的字符串长度的复杂性是多少 答案取决于 正则表达式 的确切含义 经典的正则表达式可以是compiled into 确定性有限自动机可以匹配长度的字符串N in O N 时间 正则表达式语言的某些扩展使情况变得更
  • 核心数据和保留周期

    我有一个核心数据类 Game 它与另一个类 Player 具有一对多关系 这就是他们的标题的样子 property nonatomic retain NSSet players In Game h property nonatomic re
  • 集合中的插入顺序(解析 {} 时)[重复]

    这个问题在这里已经有答案了 有人问here为什么放的时候1 and True in a set only 1保持 这当然是因为1 True 但在哪些情况下1被保留 在什么情况下True保持 让我们来看看 通过一个list建立set而不是使用