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


178

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

23
この質問の3000のDUPのうち、この1は説明の答えがあるなぜ言語がこのように設計された(そしてそれは3.xのに再設計された理由を)。これはこの質問の一部ではありませんが、ここにリンクされている多くの質問の一部です。
abarnert 2013年

回答:


209

以下からの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()

55
Py3kで変更したのは良いことです。私が最初にこの質問を見たとき、私の考えは「何だ、これはエラーを発生させないのか?」でした。
JAL

9
注意:異なるタイプがタイプの名前で順序付けられる2.xルールの例外は、Noneオブジェクトは常に他のすべてのタイプよりも小さいと比較されることです。3.xでは、Noneを別の型と比較すると、TypeErrorが発生します。
デイブカービー

4
@KarelBilek:boolは数値型です。また、True == 1なので、<でも>でもありません。
abarnert 2013年

3
タイプ名の辞書順 いつこれを機能にしたいですか?誰がそれを使うでしょうか?
ジャック、

3
楽しい事実:complex(1,0) > 'abc'あるFalseが、complex(1,0) > complex(0,0)提起TypeError
エリックDuminil

24

文字列辞書式に比較され、異なるタイプはタイプの名前("int"< "string")で比較されます。3.xは、2番目のポイントを比較不可能にすることで修正します。


3
しかしpython2では、intはdictsよりも小さいので、型名によって辞書式に並べることはできませんか?
トニーサフォーク66

私はこの答えに出くわし、Tony Suffolkに同意しました。異なる場合、オブジェクトはタイプ名で並べられません。
Exelian 2017年

@ TonySuffolk66数値型はその規則の例外です。NumericTypeは、2.7の他のタイプ(NoneTypeを除く)よりも常に低くなっています。
lef
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.