Pythonにおける==演算子とis演算子の違い

動作環境

windows 10
python 3.7.7

事の発端

例えばJavaではデータ型の場合、「==」演算子を使って比較して、参照型(オブジェクト)の場合、「equals( )」メソッドを使って比較するというルールがあります。(参考)
Pythonでは「==」演算子と「is」演算子がありますが、深く考えずに「==」を「is」に置き換えたらエラーになったので、改めてPythonにおける「==」演算子と「is」演算子の違いを考えるに至りました。

結論

Pythonの「is」演算子は、同じオブジェクトであるかを判断します、つまり、オブジェクトのidを比較します。これに対して、Pythonの「==」演算子は、オブジェクト同士の値が等しいかどうかを判断します。つまり、Pythonでは安易に==をisに置換するとおかしくなります。

実験コード

省略。

おまけ(他言語との比較)

c言語で文字列の比較はstrcmp等を使います。また、Javaでは文字列の比較にequalsを使います。なので、Pythonも比較ための関数を使うのかと思いますが、Pythonの文字列の比較は「==」演算子で良いのです。逆に、Javaで「==」演算子で文字列を比較するとバグの温床になります。⇒参考ページ

PEP 8ではboolean型はisを推奨しているが、isはオブジェクトのidを比較しているので、おかしくならないか?

論よりコード。以下のコードを実行して確認してみます。

bool = False
print(id(bool))
print(str(id(False)) + "← FalseのID")
print("=========")
bool = True
print(str(id(bool)) + "← 変数boolにTrueを代入したときのID")
print(str(id(True)) + "← TrueのID")
print("=========")
bool = 2
print(id(bool))
print(str(id(True)) + "← TrueのID")
print("=========")
bool = 3
print(id(bool))
print(str(id(True)) + "← TrueのID")
print("=========")
bool_2 = True
print(str(id(bool_2)) + "← 変数boolにTrueを代入したときと同じIDになっている")
print(str(id(True)) + "← TrueのID")

(実行結果)
10300256
10300256← FalseのID
=========
10302848← 変数boolにTrueを代入したときのID
10302848← TrueのID
=========
10914528
10302848← TrueのID
=========
10914560
10302848← TrueのID
=========
10302848← 変数boolにTrueを代入したときと同じIDになっている
10302848← TrueのID

実行結果を見ると、PythonではオブジェクトのIDは値を入れるごとに変更されています。このように動作するため、PythonではTrue or Flaseの比較にisを使っても問題は発生しません(PEP 8でも推奨されています)。