pythonのif文を記述するときに、
「==」と「is」といった似たような演算子があることに気づくと思う。
今回は、それぞれの違いを具体例をまじえながら記述する。
== と isの違い
== 演算子
→2つのオブジェクトの値を比較する演算子。
記載の通り、値を比較する演算子。
いくつかの組み込みの数値型 (数値型 int, float, complex) など異なる型同士を比較できる
6.10.1. 値の比較
演算子 <, >, ==, >=, <=, および != は2つのオブジェクトの値を比較します。 オブジェクトが同じ型を持つ必要はりません。
is 演算子
→2つのオブジェクトの同一性を比較する演算子。
- 同一性とは
メモリ上に作成されたオブジェクトに対して、ユニークなアドレスのようなものが割り当てられる性質のこと。
なので、上記の同一性の比較とは、オブジェクト作成時に割り当てられたIDが同じかどうかを調べるということになる。同じオブジェクトを指していれば同じIDになる。
6.10.3. 同一性の比較
演算子 is および is not は、オブジェクトの同一性に対するテストを行います: x is y は、 x と y が同じオブジェクトを指すとき、かつそのときに限り真になります。 オブジェクトの同一性は id() 関数を使って判定されます。 x is not y は is の真値を反転したものになります。
具体例
==演算子
==はオブジェクト同士が等価であるかを判定する演算子なので、
以下のように値が同じかを調べたいときに使用する。
(例1): 同一の型同士(整数型)
num_1 = 1
num_2 = 1
# 値が等しいかをチェックする
if num_1 == num_2:
print('num_1とnum_2は同じ値です')
実行結果
num_1とnum_2は同じ値です
(例2): 違う型を持つオブジェクト同士の比較
# int型
num_1 = 1
# float型
num_2 = 1.0
# 値が等しいかをチェックする
if num_1 == num_2:
print('num_1とnum_2は同じ値です')
実行結果
num_1とnum_2は同じ値です
前述した通り、数値型 (数値型 int, float, complex)などという条件付きで
型が同じではなくても、値が同じであれば条件式はTrueを返す。
(例3): 違う型(整数型と文字列型)持つオブジェクト同士の比較
# int型
num_1 = 1
# string型
num_2 = '1'
# 値が等しいかをチェックする
if num_1 == num_2:
print('num_1とnum_2は同じ値です')
実行結果
# 何も表示されない(つまりFalse)
数値型と文字列型は比較してもFalseと判定されるため注意が必要。
is演算子
isはオブジェクト同士が同じオブジェクトであるか(同一)を判定するときに使う。
(例1): 同じ値を持つリスト
list_1 = [1, 2, 3]
list_2 = [1, 2, 3]
# オブジェクトが等しいかをチェックする
if list_1 is list_2:
print('list_1とlist_2は同じオブジェクトです')
else:
print('list_1とlist_2は同じオブジェクトじゃない')
実行結果
list_1とlist_2は同じオブジェクトじゃない
値は同じでも、オブジェクトは同じではない(=メモリ上では同じIDで管理されていない)ため、Falseとなる。
(例2): オブジェクトがNoneか否か
list_1 = None
# オブジェクトがNoneかをチェックする
if list_1 is None:
print('list_1はNoneです')
else:
print('list_1はNoneじゃない')
実行結果
list_1はNoneです
(例3): 再代入されたオブジェクト
list_1 = [1, 2, 3]
list_2 = list_1
# オブジェクトが等しいかをチェックする
if list_1 is list_2:
print('list_1とlist_2は同じオブジェクトです')
else:
print('list_1とlist_2は同じオブジェクトじゃない')
実行結果
list_1とlist_2は同じオブジェクトです
pythonでは、リストや辞書はオブジェクトの参照渡しのため、
メモリ上list_1 と list_2は同じオブジェクトとして扱われるため。