web-dev-qa-db-ja.com

Python 2はstringとintをどのように比較しますか?リストが数値よりも大きく、タプルがリストよりも大きいのはなぜですか?

次のスニペットに出力の注釈が付けられています( 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言語のバージョンに違いはありますか?
171

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()
204
Mark Byers

文字列are辞書順に比較され、類似しないタイプは、そのタイプの名前("int" <"string")で比較されます。 3.xは、2番目の点を比較不可能にすることで修正します。