我有一个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)
进行复制问题是:这是在某个地方记录的(到目前为止还没找到),这是正常的,是否可以依赖它?
额外的问题:排序何时完成?在印刷期间?它内部存储排序? (考虑到插入的预期复杂性,这是否可能?)
答案 0 :(得分:8)
这是巧合。数据既没有排序也没有__str__
排序。
整数的哈希值等于它们的值(除了-1
和sys.maxint
范围之外的长整数),增加了整数按顺序排列的机会,但这不是给定的。
set
使用哈希表来跟踪包含的项目,排序取决于哈希值,和插入和删除历史记录。
整数和集合之间交互的方式和原因都是实现细节,并且可以随版本的不同而变化。 Python 3.3为某些类型引入了哈希随机化,Python 3.4对此进行了扩展,使得Python进程重启之间的集合和字典的排序也不稳定(取决于存储的值的类型)。