2つのオブジェクトが同じかどうかを確認する場合は、==演算子やis演算子を使います。
本記事では、この二つの違いについてまとめました。
is演算子
is演算子は、2つのオブジェクトの同一性が同じであればTrueを、異なればFalseを返します。
同一性は、id()関数 で調べることができます。
<参考>
- 公式)Python 言語リファレンス: 3.1. オブジェクト、値、および型
- 公式)Python 言語リファレンス: 6.10.3. 同一性の比較
==演算子
==演算子は、2つのオブジェクトの値を比較します。
型が異なっている場合はFalseを返しますが、数値型(int, float, complex等)の場合は比較対象の型が異なっていても値が同じであればTrueとなります。
<参考>
- 公式)Python 言語リファレンス: 6.10.1. 値の比較
具体例
数値型(int, float, complexなど)同士は、異なる型でも値が同じであれば等価比較(==演算子)はTrueになります。
- int型同士の比較
>>> a = 1 # int型 id(a): 140176713335024
>>> b = 1 # int型 id(b): 140176713335024
>>> a == b
True
>>> a is b
True
>>> a = 1 # int型 id(a): 140176713335024
>>> b = 1.0 # float型 id(b): 140176712292944
>>> a == b # 値は同じなのでTrue
True
>>> a is b # id()が異なるのでFalse
False
>>> a = 1 # int型 id(a): 140176713335024
>>> c = 1+0j # complex型 id(c): 140176711143280
>>> a == c # 値は同じなのでTrue
True
>>> a is c # id()が異なるのでFalse
False
>>> b = 1.0 # float型 id(b): 140176712292944
>>> c = 1+0j # complex型 id(c): 140176711143280
>>> b == c # 値は同じなのでTrue
True
>>> b is c # id()が異なるのでFalse
False
文字列の場合は、文字のUnicodeのコードポイント(※)が同じ場合に等価比較(==演算子)でTrueとなります。(公式リファレンスより)
※)ord() で取得できる値
>>> x = 'abc' # id(x): 140176712531184
>>> y = 'abc' # id(y): 140176712531184
>>> x == y
True
>>> x is y
True
シーケンス(list, tuple等)の場合は、型、長さ、要素が等価であればTrueを返します。
それ以外はFalseとなります。
- 型、長さ、要素が等価の場合
>>> x = [1, 2] # list型 id(x): 140176711373888
>>> y = [1, 2] # list型 id(y): 140176711254208
>>> x == y # 型、長さ、要素が等価なのでTrue
True
>>> x is y # id()が異なるのでFalse
False
>>> x = [1, 2] # list型 id(x): 140176711373888
>>> z = (1, 2) # tuple型 id(z): 140176711268160
>>> x == z # 型が異なるのでFalse
False
>>> x is z
False
# 要素が数値型
>>> x = [1, 2] # list型 id(x): 140176711373888
>>> xx = [1.0, 2.0] # list型 id(xx): 140176711266688
>>> x == xx
True
>>> x is xx
False
# 要素が数値型以外
>>> x = [1, 2] # list型 id(x): 140176711373888
>>> yy = ['1', '2'] # list型 id(yy): 140176711254208
>>> x == yy
False
>>> x is y
False
辞書型は、keyとvalueが同じ場合に等価比較(==演算子)がTrueとなります。
>>> x = {'abc':1, 'xyz':9} # id(x): 140176712555456
>>> y = {'abc':1, 'xyz':9} # id(y): 140176711374016
>>> x == y
True
>>> x is y
False
集合 (setまたはfrozenset) の場合、
- 要素の順番は関係なし
>>> x = {1,2,3} # id(x): 140176712773504
>>> y = {2,1,3} # id(y): 140176712773280
>>> x == y
True
>>> x is y
False
>>> x = {1,2,3} # id(x): 140176712773280
>>> y = frozenset({1,2,3}) # id(y): 140176710710240
>>> x == y
True
>>> x is y
False
クラスの場合は==演算子とis演算子は同じです。
>>> class Myclass:
... x = 1
...
>>> f = Myclass() # id(f): 140176711340608
>>> g = Myclass() # id(g): 140176711345888
# 生成したそれぞれのインスタンスを比較
>>> f == g
False
>>> f is g
False
環境
- OS: Ubuntu20.04LTS@WSL2
- Python3.9.7
まとめ
- ==演算子は、2つのオブジェクトの値を比較する(数値型は異なる型の比較でもTrueになる)
- is演算子は、2つのオブジェクトの同一性(id()で確認できる)を比較する
コメント
[…] 演算子 == と is の違い | Hbk project […]