Bil*_*ljk 10 python algorithm hashtable set python-internals
让我们说你有一套:
foo = {1, 2, 3, 4, 5}
Run Code Online (Sandbox Code Playgroud)
在我正在阅读的书中,Pro Python,它说使用foo.pop()将弹出该选择中的任意数字.但是......当我尝试它时,它pops 1, then 2, then 3...是否随意做,或者这只是巧合?
Amb*_*ber 16
它说它是任意的原因是因为无法保证它会弹出的顺序.由于您刚刚创建了集合,因此它可能以"漂亮"的顺序存储元素,因此.pop()恰好以该顺序返回它们,但如果您要改变集合,则可能不会继续保持.
例:
>>> foo = set()
>>> foo.add(-3)
>>> foo.add(-1)
>>> foo.add(2)
>>> foo.pop()
2
>>> foo.pop()
-3
Run Code Online (Sandbox Code Playgroud)
Ray*_*ger 15
使用哈希表实现集和字典.它们是无序的集合,这意味着它们没有保证的订单.
您看到的订单是无保证的实施细节.在CPython中,整数的哈希值是整数本身:
>>> [hash(i) for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
该实现细节导致整数在您的集合中显示为有序.其他套装将是半订购的,{5, 6, 7, 8, 9}显示为set([8, 9, 5, 6, 7]).
相比之下,其他数据类型(如str)具有不同的散列函数,并且看起来更加混乱.例如:
# Example of scrambling str objects in a 64-bit build
>>> {'red', 'green', 'blue'}
set(['blue', 'green', 'red'])
Run Code Online (Sandbox Code Playgroud)
该set.pop方法弹出关闭左到右的条目.这也是一个无保证的实现细节.
对你的问题的简短回答是肯定的,顺序是任意的,但不,你看到的不仅仅是巧合,而是一个有趣的无保证实现细节.
希望这能为你揭开神秘面纱:-)