次のスニペットには出力が注釈されています(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 実装間に違いはありますか?
- Python 言語のバージョン間に違いはありますか?
ベストアンサー1
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
唯一の例外は、常に新しいスタイルのクラスの前に来る古いスタイルのクラスです。
>>> 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()