Pythonでは、isと==のどちらも比較演算子として使用されますが、比較している対象が異なります。
-
is:オブジェクトの同一性(Identity)を比較する -
==:オブジェクトの値の等価性(Equality)を比較する
この違いを理解することで、意図しないバグを防ぐことができます。
isと==の違い
| 比較演算子 | 説明 | 使用例 |
|---|---|---|
is |
2つの変数が同じオブジェクトを参照しているかを比較する | x is y |
== |
2つのオブジェクトの値が等しいかを比較する | x == y |
is の詳細
isは、2つの変数が同一のオブジェクトを参照しているかどうかを確認します。
a = [1, 2, 3]
b = a # bはaと同じオブジェクトを参照
print(a is b) # True
print(a == b) # True
この例では、aとbは同じリストオブジェクトを参照しているため、isも==もTrueになります。
主な用途は次のとおりです。
-
Noneとの比較 -
TrueやFalseなどのシングルトンオブジェクトとの比較 - オブジェクトの同一性を確認したい場合
== の詳細
==は、オブジェクトの値が等しいかどうかを比較します。
a = [1, 2, 3]
b = [1, 2, 3]
print(a is b) # False
print(a == b) # True
この例では、aとbは別々のリストオブジェクトですが、内容は同じであるため==はTrueになります。
is を使う際の注意点
Noneの比較にはisを使う
PEP 8でも、Noneとの比較にはisまたはis notの使用が推奨されています。
x = None
if x is None:
print("xはNoneです")
値の比較にはisを使わない
整数や文字列などのイミュータブルオブジェクトでは、Pythonの最適化によって同じオブジェクトが再利用される場合があります。
そのため、値の比較にisを使うと、環境や実装によって結果が変わる可能性があります。
a = 1000
b = 1000
print(a == b) # True
print(a is b) # 実行環境によって異なる可能性がある
また、小さな整数はPython内部でキャッシュされるため、isがTrueになることがあります。
a = 10
b = 10
print(a is b) # Trueになることが多い
ただし、この挙動に依存したコードを書くべきではありません。
まとめ
-
isはオブジェクトの同一性を比較する -
==はオブジェクトの値を比較する -
Noneとの比較にはisを使用する - 値の比較には基本的に
==を使用する - 整数や文字列に対して
isを使用すると、実装依存の挙動により予期しない結果になる可能性がある
迷った場合は、値の比較なら==、オブジェクトの同一性を確認したい場合のみisを使う、と覚えておくとよいでしょう。