5.9 比較 (comparison)

C 言語と違って、Python における比較演算子は同じ優先順位をもっており、 全ての算術演算子、シフト演算子、ビット単位演算子よりも低くなっています。 また、a < b < c が数学で伝統的に用いられているのと同じ解釈に なる点も C 言語と違います:

comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
| "is" ["not"] | ["not"] "in"
Download entire grammar as text.

比較演算の結果はブール値: True または False になります。

比較はいくらでも連鎖することができます。例えば x < y <= zx < y and y <= z と等価になります。ただしこの場合、前者では y はただ一度だけ評価される点が異なります (どちらの場合でも、 x < y が偽になると z の値はまったく評価されません)。

形式的には、 a, b, c, ..., y, z が式で、opa, opb, ..., opy が比較演算子で ある場合、a opa b opb c ...y opy za opa b and b opb c and ... y opy z と等価になります。ただし、前者では各式は多くても一度 しか評価されません。

a opa b opb c と書いた場合、 a から c までの範囲 にあるかどうかのテストを指すのではないことに注意してください。 例えば、x < y > z は (きれいな書き方ではありませんが) 完全に正しい文法です。

<>!= の二つの形式は等価です; C との整合性を 持たせるためには、!= を推奨します; 以下で != について 触れている部分では、<> を使うこともできます。 <> のような書き方は、現在では古い書き方とみなされています。

演算子 <, >, ==, >=, <=, および != は、二つのオブジェクト間の値を比較します。オブジェクトは 同じ型である必要はありません。双方のオブジェクトが数値であれば、 共通型への変換が行われます。それ以外の場合、異なる型のオブジェクトは 常に 不等であるとみなされ、一貫してはいるが規定されていない 方法で並べられます。組み込み型でないオブジェクト比較の振る舞いは __cmp__ メソッドや __gt__ といったリッチな比較メソッドを 定義することでコントロールすることができます。これは 3.4 セクションで 説明されています。

(このような比較演算の変則的な定義は、ソートのような操作や、 in およびnot in といった演算子の定義を 単純化するためのものです。将来、異なる型のオブジェクト間における 比較規則は変更されるかもしれません。)

同じ型のオブジェクト間における比較は、型によって異なります:

演算子 in および not in は、集合内の要素であるか どうか (メンバシップ、membership) を調べます。 x in s は、x が集合 s のメンバである 場合には真となり、それ以外の場合には偽となります。 x not in sx in s の否定 (negation) を返します。集合メンバシップテストは、伝統的には シーケンス型に限定されてきました; すなわち、あるオブジェクトがある集合 のメンバとなるのは、集合がシーケンス型であり、シーケンスがオブジェクトと等価な 要素を含む場合でした。しかしながら、現在ではオブジェクトがシーケンスで なくてもメンバシップテストをサポートしています。特に、 辞書型では、key in dict と書くことで、 うまい具合にメンバシップテストをサポートしています; 他のマップ型も これに倣っているかもしれません。

リストやタプル型については、x in yx == y[i] となるようなインデクス i が存在するとき、かつそのときに限り真になります。

Unicode 文字列または文字列型については、x in yxy の部分文字列であるとき、かつそのときに限り 真になります。この演算と等価なテストは y.find(x) != -1 です。 x および y は同じ型である必要はないので注意してください。 すなわち、u'ab' in 'abc'True を返すことになります。 空文字列は、他のどんな文字列に対しても常に部分文字列とみなされます。 従って、"" in "abc"True を返すことになります。 バージョン 2.3 で 変更 された仕様: 以前は、x は長さ 1 の文字列型でなければ なりませんでした

__contains__() メソッドの定義されたユーザ定義クラスでは、 x in y が真となるのは y.__contains__(x) が真となるとき、かつそのときに限ります。

__contains__() は定義していないが __getitem__() は定義しているようなユーザ定義クラスでは、 x in yx == y[i] となるような非負の整数インデクス i が存在するとき、かつそのときにかぎり真となります。 インデクス i が負である場合に IndexError 例外が 送出されることはありません。 (別の何らかの例外が送出された場合、 例外は in から送出されたかのようになります)。

演算子 not in は、in の真値に対する逆転として定義されて います。

演算子 is および is not は、オブジェクトの アイデンティティに対するテストを行います: x is y は、 xy が同じオブジェクト を指すとき、かつそのときに限り真になります。 x is not y は、is の真値を逆転したもの になります。



脚注

... したものが等しい場合に等価になります。5.4
実装では、この 演算をリストを構築したりソートしたりすることなく効率的に 行います。
... のいずれかです。5.5
Python の初期のバージョンでは、ソートされた (key, value) のリストに対して辞書的な比較を行っていましたが、 これは等価性の計算のようなよくある操作を実現するには非常に コストの高い操作でした。もっと以前のバージョンの Python では、辞書は アイデンティティだけで比較されていました。しかしこの仕様は、 {} との比較によって辞書が空であるか確かめられると期待して いた人々を混乱させていました。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。