You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 2与3中集合的无序性差异及Python 2.7排序规则问询

Python 2.7 集合字面量的固定打印顺序是怎么来的?

这个问题挺有意思的——明明Python里的集合是无序的,但2.7里用{'a', 'b', 'c'}创建的集合,打印出来居然总是set(['a', 'c', 'b']),而且还和元素的哈希值顺序对不上,我来拆解一下背后的逻辑:

首先得明确,Python 2.7的集合底层是哈希表实现的,集合的打印顺序完全取决于哈希表的遍历顺序——也就是从0号槽位开始,按顺序往后扫,遇到有元素的槽位就把元素加入输出列表,最后拼成字符串。

那为什么'a'、'b'、'c'会是这个固定顺序?核心在于两个细节:

  1. 集合初始化时的默认哈希表大小是8
  2. 这三个字符在Python 2.7中的哈希值对8取模后,得到的槽位顺序是'a'在前,然后是'c',最后是'b'

举个实际计算的例子(不同平台哈希值可能有细微差异,但模8结果大概率一致):
在Python 2.7里,hash('a')的结果可能是负数,比如-1569245686,对8取模后得到2;hash('b')取模8得到7;hash('c')取模8得到4。这样哈希表的槽位2存'a',槽位4存'c',槽位7存'b'。当遍历哈希表时,从0到7依次检查,就会先拿到'a',然后是'c',最后是'b',所以打印结果固定为set(['a', 'c', 'b'])。

你提到“哈希值并非此输出顺序”,这是因为哈希值本身的大小顺序和槽位顺序不对应——比如'b'的哈希值可能比'c'小,但它的槽位在更靠后的位置,所以遍历的时候会晚出现。

再说说Python 3.x的情况:

  • 从Python 3.3开始,默认开启了哈希随机化,每次启动Python时,字符串的哈希值都会变化,所以集合的打印顺序也会跟着随机变化,不再固定。
  • 哪怕是Python 3.6+,字典已经改成了保留插入顺序,但集合的底层实现并没有跟进这个逻辑,它依然是基于无序的哈希表,所以打印顺序还是随机的,不会和字面量的顺序一致。

内容的提问来源于stack exchange,提问作者jmd_dk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:42:35