我有一个 set
,我向其中添加项目(整数),当我打印它时,项目显然已排序:
a = set()
a.add(3)
a.add(2)
a.add(4)
a.add(1)
a.add(5)
print a
# set([1, 2, 3, 4, 5])
我尝试过各种值,显然它只需要是整数。
我在 MacOSX 下运行 Python 2.7.5。它也使用 repl.it 复制(参见 http://repl.it/TpV )
问题是:这是否在某处记录(目前尚未找到),是否正常,是否可以依赖?
附加问题:排序什么时候完成?在打印期间?它是内部存储排序的吗? (考虑到插入的预期恒定复杂性,这甚至可能吗?)
最佳答案
这是巧合。数据既不排序也不 __str__
排序。
整数的哈希值等于它们的值(-1
和 sys.maxint
范围外的长整数除外),这增加了机会 整数是按顺序插入的,但这不是给定的。
set
使用哈希表来跟踪包含的项目,排序取决于哈希值、和插入和删除历史记录。
整数和集合之间交互的方式和原因都是实现细节,并且很容易因版本而异。 Python 3.3 为某些类型引入了哈希随机化,Python 3.4 对此进行了扩展,使得集合和字典的排序在 Python 进程重新启动之间也变得易变(取决于存储的值的类型)。
关于python - 集合是在内部排序的,还是显示排序列表的 __str__ 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24126240/