123 < list
が評価されるのはなぜTrue
ですか? それとも?list < 123
_ False
それとも?list < dict
_True
より一般的には、数値が関数やリストなどと比較されたときにエラーが発生するのはなぜ<
ですか? >
このデザインの選択の背後にあるロジックは何ですか?
(これは Python 2.7 にあることに注意してください。まだ試していない Python 3 には当てはまらない可能性があります)
123 < list
が評価されるのはなぜTrue
ですか? それとも?list < 123
_ False
それとも?list < dict
_True
より一般的には、数値が関数やリストなどと比較されたときにエラーが発生するのはなぜ<
ですか? >
このデザインの選択の背後にあるロジックは何ですか?
(これは Python 2.7 にあることに注意してください。まだ試していない Python 3 には当てはまらない可能性があります)
Python2では、ドキュメントには次のように書かれています:
CPython 実装の詳細: 数値以外の異なる型のオブジェクトは、型名によって並べ替えられます。適切な比較をサポートしない同じタイプのオブジェクトは、アドレス順に並べられます。
Python3 では、この疣贅は修正されています。
順序比較演算子 (<、<=、>=、>) は、オペランドに意味のある自然順序付けがない場合、TypeError 例外を発生させます。したがって、1 < '', 0 > None または len <= len のような式はもはや有効ではなく、たとえば None < None は False を返す代わりに TypeError を発生させます。当然のことながら、異種のリストをソートすることはもはや意味がありません。すべての要素が互いに比較可能でなければなりません。これは == および != 演算子には適用されないことに注意してください: 異なる比較不可能な型のオブジェクトは、常に互いに比較して等しくありません。
このような場合の比較はtype()
、オブジェクトに基づいて行われます。
たとえば、:type(123)
is'int'
とtype(list)
isであるため、 returns'list'
の文字列比較は'int'<'list'
True
>>> 123<list
True
>>> type(123)<type(list)
True