22

Python None から学んだこと:

None is frequently used to represent the absence of a value

リストに入れて数字と文字列でソートすると。次の結果が得られました。これは、最小の数値であることを意味します。

逆行する:

>>> sorted([1, 2, None, 4.5, (-sys.maxint - 1), (sys.maxint - 1), 'abc'], reverse=True)
['abc', 9223372036854775806, 4.5, 2, 1, -9223372036854775808, None]
>>>

通常の並べ替え:

>>> sorted([1, 2, None, 4.5, (-sys.maxint - 1), (sys.maxint - 1), 'abc'])
[None, -9223372036854775808, 1, 2, 4.5, 9223372036854775806, 'abc']
>>>

python sorted 関数は None でどのように機能していますか?

4

1 に答える 1

42

異なるタイプを比較する場合、CPython 2 はいくつかの異なるルールを適用します。

  • None最初にソートされます。
  • 数値は他の型の前に来て、それらの間で数値的に比較されます。
  • 他の型は、明示的に比較メソッドを実装しない限り、型名で並べられます。

さらに、一部の型はカスタムの並べ替え規則を実装しており、並べ替えの試みをすべて拒否できます。たとえば、複素数を並べ替えようとすると例外が発生し、datetimeオブジェクトは他の型と比較して並べ替えようとすると例外が発生します。

これは、Python リファレンス ドキュメントには記載されていません。代わりに、デフォルトの比較コードをobject.c参照してください。これは実装の詳細であり、コードが依存すべきものではありません。比較演算子のドキュメントには次のように記載されています。

組み込み型の他のほとんどのオブジェクトは、同じオブジェクトでない限り、等しくありません。あるオブジェクトを別のオブジェクトよりも小さいと見なすか大きいと見なすかの選択は、任意に行われますが、プログラムの 1 回の実行内で一貫して行われます。

目標は、混合オブジェクトのシーケンスをソートするときに、異なるタイプ間の比較を安定させることでした。

Python 3 では、比較規則が強化されました。明示的に比較を実装するオブジェクトのみを比較できます。何年にもわたる経験の結果、恣意的な比較を許可することは、より多くの混乱を招くだけであるという結論が導き出されました。たとえば、数値を含む文字列を整数と比較すると、初心者は常に混乱します。

代わりに、コードで例外が発生します。

于 2014-02-26T12:02:30.693 に答える