1. ホーム
  2. python

[解決済み] Python 2 は文字列と int をどのように比較するのですか?なぜリストは数値より大きく、タプルはリストより大きく比較されるのですか?

2022-04-21 08:01:41

質問

次のスニペットは、出力にアノテーションをつけたものです( 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言語のバージョンによる違いはありますか?

どのように解決するのですか?

からの 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

例外として、旧式のクラスは常に新式のクラスより前に来ます。

>>> 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()