是内部排序集,还是显示排序列表的__str__方法?

时间:2014-06-09 18:11:31

标签: python python-2.7 set

我有一个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

进行复制

问题是:这是在某个地方记录的(到目前为止还没找到),这是正常的,是否可以依赖它?

额外的问题:排序何时完成?在印刷期间?它内部存储排序? (考虑到插入的预期复杂性,这是否可能?)

1 个答案:

答案 0 :(得分:8)

这是巧合。数据既没有排序也没有__str__排序。

整数的哈希值等于它们的值(除了-1sys.maxint范围之外的长整数),增加了整数按顺序排列的机会,但这不是给定的。

set使用哈希表来跟踪包含的项目,排序取决于哈希值,插入和删除历史记录。

整数和集合之间交互的方式和原因都是实现细节,并且可以随版本的不同而变化。 Python 3.3为某些类型引入了哈希随机化,Python 3.4对此进行了扩展,使得Python进程重启之间的集合和字典的排序也不稳定(取决于存储的值的类型)。