質問: set() s.add(1) s.add(2) s.add(3) print(s) # {1, 2, 3} ``` このコードでは常に昇順で表示されます。 この理由はなんでしょうか。
回答: ***この理由はなんでしょうか。*** 「たまたま」です。 まず、ひとつ確認しておかなくてはいけないのは「順序づけられていない」と言うのと「printした際の要素の表示順はランダムになる」と言うのとは別だと言うことです。 Pythonがある要素を`set`に保持する場合、その内部的な順序は「簡単に予測出来ない何らかの方法」で決まります。ランダムに決めるかどうかは「順序づけられていない」と言う言葉には含まれていません。 したがって、特定の要素(1,2,3)を`set`に保持した後、printした際の表示順が「たまたま昇順」になることはいくらでもあり得ます。「何らかの方法」が非決定性の乱数かなんかに基づく挙動を示すなんて保証もありませんから、「たまたま」(その要素の組み合わせの場合には)「常に昇順で表示」されるように見えることもあるかもしれません。 こちらは「python set order」で出てきた記事の例: ``` s = set() s.add(1) s.add(2) s.add(20) s.add(6) s.add(100) print(s) # ->{1, 2, 100, 6, 20} ``` 私が試したところ、上の例は昇順でも要素の追加順でもない順番で表示されました。別のバージョンの処理系であれば、別の順番になるかもしれません。