一般的に答えはノーです。@Christopheと@Marcin(un)が役立つPythonソースは、要素がハッシュテーブルに表示される順序でポップされることを示しています。したがって、ポップ順序(およびおそらく反復順序)は決定論的ですが、固定ハッシュ値に対してのみです。のドキュメントの注によると、これは数字には当てはまりますが、文字列には当てはまりません。これは、偶然にもあなたの質問に直接触れています。__hash__
デフォルトでは、str、bytes、およびdatetimeオブジェクトのハッシュ()値は、予測できないランダムな値で「ソルト」されていることに注意してください。それらは個々のPythonプロセス内で一定のままですが、Pythonを繰り返し呼び出す間で予測することはできません。
[...]
ハッシュ値を変更すると、dict、set、およびその他のマッピングの反復順序に影響します。Pythonは、この順序について保証していません(通常、32ビットビルドと64ビットビルドの間で異なります)。
編集: @Marcinが指摘しているように、私が引用したリンクはPython2には適用されません。Python3.3ではハッシュのランダム化がデフォルトになりました。Python 2.7には、デフォルトで意図的に非決定論的な文字列ハッシュがありません。
一般に、これは、ハッシュがその値の反復可能な関数ではないオブジェクトの場合に問題になります(たとえば、ハッシュがメモリアドレスに基づいている場合)。ただし、逆に、__hash__
セット内のオブジェクトに対して独自のメソッドを定義すると、再現可能な順序でオブジェクトが返されることが期待できます。(セットの履歴とプラットフォームが固定されている場合)。