10

セットがあるとしましょう:

foo = {1, 2, 3, 4, 5}

私が現在読んでいる本、Pro Python では、使用foo.pop()するとその選択から任意の数がポップされると書かれています。でも…やってみるとpops 1, then 2, then 3...勝手にやるのか、それともたまたまなのか。

4

2 に答える 2

16

任意であると言う理由は、飛び出す順序について保証がないためです。セットを作成したばかりなので、要素を「適切な」順序で格納している可能性があり、.pop()たまたまその順序でそれらが返されますが、セットを変更すると、保持されなくなる可能性があります。

例:

>>> foo = set()
>>> foo.add(-3)
>>> foo.add(-1)
>>> foo.add(2)
>>> foo.pop()
2
>>> foo.pop()
-3
于 2012-03-24T02:43:15.663 に答える
15

セットと辞書は、ハッシュ テーブルを使用して実装されます。これらは順序付けされていないコレクションです。つまり、順序が保証されていません。

表示されている順序は、保証されていない実装の詳細です。CPython では、整数のハッシュ値は整数そのものです。

>>> [hash(i) for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

その実装の詳細により、整数がセット内で順序付けられて表示されます。他のセットはセミオーダーで、 のように{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'])

set.popメソッドは、エントリを左から右にポップします。これも保証されていない実装の詳細です。

あなたの質問に対する簡単な答えは、はい、順序は任意ですが、いいえ、あなたが見たのは単なる偶然ではなく、保証されていない興味深い実装の詳細でした。

これで謎が解けることを願っています:-)

于 2012-03-24T02:54:34.547 に答える