无序集合 - Python 中的集合

5
抱歉,如果这是一个基础问题,但我想了解在Python中如何使用set类型。根据文档

集合对象是独特可哈希对象的无序集合。

作为无序集合,集合不记录元素位置或插入顺序。

但是,如果它们是无序的,为什么我在这个测试中总是得到相同的顺序?我期望一些随机顺序。

users_ids = set([1, 1, 2, 3])
>>> print users_ids
set([1, 2, 3])

因为您正在使用整数,它们将按顺序进行哈希。 - That1Guy
@That1Guy 不总是这样。这也取决于整数的大小。 - smac89
@Smac89 那是一个公正的观点。 - That1Guy
1个回答

10
一个随机的排序并不是无序的。无序的意思是数据没有明确定义的排序方式,例如插入顺序或者数据与排列方式之间没有任何相关性。
数据总是能够以可预测的方式排序,因为特定的实现选择将元素以插入顺序为依据来排列它们。但是,并没有保证#这种情况总是发生,我们可以在 Python 3.X 字典实现中看到这种情况的偏差。 注意: 即使我们看到数据已被排序,
>>> {1,2,3,4,5}
set([1, 2, 3, 4, 5])

除非文档严格说明并提供其顺序的保证,否则我们仍将称之为无序。否则可能会有意外等着你。我见过一些依赖于集合和字典基于插入模式维护顺序的实现。当它们被移植到Python 3.X时,这样的实现会产生严重后果。

#

What’s New In Python 3.3

Security improvements:
    Hash randomization is switched on by default.

你能分享一个链接,描述Python 3.X字典的实现方式以及它与Python 2.X的区别吗? - That1Guy
让我看看我是否理解正确。在Python 2.7中,集合是无序的,但特定的实现保持插入顺序?在这种情况下,它们可能是有序的,但未来版本不能保证。我的理解是正确的吗? - user2990084
2
@That1Guy 在3.3版本及以上的区别是由于哈希中的随机性-请参见https://dev59.com/gWUp5IYBdhLWcg3w6qyq#14959001 - jonrsharpe
@user2990084:说它保持插入顺序是错误的,但我的意思是,每次按特定顺序插入相同数据时,字典会以一种定义好的方式进行维护。 - Abhijit
@user2990084:我已经更新了答案并附上了链接。 - Abhijit
@user2990084,你看到保留的顺序是因为你使用了连续的整数。在Python 2.X中的哈希方式,你的例子只是恰好“按顺序”。 - That1Guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接