次のスニペットに出力の注釈が付けられています( ideone.comで見られるように ):
print "100" < "2" # True
print "5" > "9" # False
print "100" < 2 # False
print 100 < "2" # True
print 5 > "9" # False
print "5" > 9 # True
print [] > float('inf') # True
print () > [] # True
なぜ出力がそうであるかを誰かが説明できますか?
python 2マニュアル から:
CPython実装の詳細:番号を除くさまざまなタイプのオブジェクトは、タイプ名順に並べられます。適切な比較をサポートしない同じタイプのオブジェクトは、アドレス順に並べられます。
2つの文字列または2つの数値タイプを注文する場合、注文は予想どおりに行われます(文字列の辞書順、整数の数値順)。
数値型と非数値型を注文すると、数値型が最初に来ます。
>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
どちらも数値ではない2つの互換性のない型を注文すると、それらは型名のアルファベット順に並べられます。
>>> [1, 2] > 'foo' # 'list' < 'str'
False
>>> (1, 2) > 'foo' # 'Tuple' > 'str'
True
>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
1つの例外は、常に新しいスタイルのクラスの前に来る古いスタイルのクラスです。
>>> class Foo: pass # old-style
>>> class Bar(object): pass # new-style
>>> Bar() < Foo()
False
この動作は言語仕様によって義務付けられていますか、それとも実装者次第ですか?
それ以外の場合、異なるタイプのオブジェクトは常に等しくないものを比較し、一貫して任意に順序付けされます。
実装の詳細です。
主要なPython実装のいずれかに違いはありますか?
公式のCPython実装しか使用していないため、これには答えられませんが、PyPyなどのPythonの実装は他にもあります。
Python言語のバージョン間に違いはありますか?
Python 3.xでは、整数と文字列を並べ替えようとするとエラーが発生するように動作が変更されました。
>>> '10' > 5
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'10' > 5
TypeError: unorderable types: str() > int()
文字列are辞書順に比較され、類似しないタイプは、そのタイプの名前("int"
<"string"
)で比較されます。 3.xは、2番目の点を比較不可能にすることで修正します。