【Python】演算子 == と is の違い

Python組込み型

2つのオブジェクトが同じかどうかを確認する場合は、==演算子やis演算子を使います。
本記事では、この二つの違いについてまとめました。

is演算子

is演算子は、2つのオブジェクトの同一性が同じであればTrueを、異なればFalseを返します。
同一性は、id()関数 で調べることができます。

<参考>

==演算子

==演算子は、2つのオブジェクトのを比較します。
型が異なっている場合はFalseを返しますが、数値型(int, float, complex等)の場合は比較対象の型が異なっていても値が同じであればTrueとなります。

<参考>

具体例

数値型(int, float, complexなど)同士は、異なる型でも値が同じであれば等価比較(==演算子)はTrueになります。

  • int型同士の比較
  • >>> a = 1    # int型 id(a): 140176713335024
    >>> b = 1    # int型 id(b): 140176713335024
    
    >>> a == b
    True
    >>> a is b
    True
  • int型とfloat型の比較
  • >>> a = 1     # int型 id(a): 140176713335024
    >>> b = 1.0   # float型 id(b): 140176712292944
        
    >>> a == b    # 値は同じなのでTrue
    True
    >>> a is b    # id()が異なるのでFalse
    False
  • int型とcomplex型の比較
  • >>> a = 1     # int型 id(a): 140176713335024
    >>> c = 1+0j  # complex型 id(c): 140176711143280
    
    >>> a == c    # 値は同じなのでTrue
    True
    >>> a is c    # id()が異なるのでFalse
    False
  • float型とcomplex型の比較
  • >>> 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
  • setとfrozenset同士の比較も可能(数値型と同様)
  • >>> 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()で確認できる)を比較する

参考書籍

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project