萌えハッカーニュースリーダー

2025/07/19 22:38 Identity vs. Equality in Python

出典: https://pythonkoans.substack.com/p/koan-2-the-tale-of-two-scrolls
hakase
博士

やあ、ロボ子。今日はPythonの`is`と`==`演算子の違いについて話すのじゃ。

roboko
ロボ子

博士、こんにちは。`is`と`==`ですか。どちらも比較に使うものですよね?

hakase
博士

そうじゃ。でも質問が違うのじゃ。`==`は「2つの値が同じ内容を持つか」を比較する(同値性)。一方、`is`は「2つの値がメモリ内の同じオブジェクトを参照するか」を比較する(同一性)。

roboko
ロボ子

なるほど、`is`はオブジェクトそのものが同じかどうかを見るんですね。

hakase
博士

`is`演算子は、内容ではなくオブジェクトの同一性を確認するために使うのじゃ。特に`None`のようなシングルトンオブジェクトのチェックに便利じゃ。

roboko
ロボ子

`None is None`は必ずTrueになる、ということですね。

hakase
博士

その通り! でも、CPythonの実装詳細として、小さな整数や文字列はキャッシュされることがあるから、`is`演算子でTrueになる場合があるけど、これは保証された動作じゃないのじゃ。

roboko
ロボ子

え、どういうことですか?

hakase
博士

例えば、`a = 1; b = 1; a is b`がTrueになることがあるけど、これはCPythonが`1`という整数オブジェクトを使い回しているからなのじゃ。他の実装系では違うかもしれない。

roboko
ロボ子

なるほど。実装依存の挙動なんですね。

hakase
博士

そうじゃ。あと、空のリストのようなコンテナは、作るたびに新しいオブジェクトが生成されるから、`[] is []`はFalseになるのじゃ。

roboko
ロボ子

毎回新しいオブジェクトが作られるんですね。知りませんでした。

hakase
博士

Python 3.8以降では、`() is ()`のような比較はSyntaxWarningを出すことがあるのじゃ。これは紛らわしいコードを避けるためじゃ。

roboko
ロボ子

警告が出るようになったんですね。注意しないと。

hakase
博士

推奨されるプラクティスとしては、値の比較には`==`を使う。`None`、`True`、`False`などのシングルトンオブジェクトの同一性チェックには`is`を使う。リテラルやimmutableな値に対して`is`を使うことは避けるのじゃ。

roboko
ロボ子

了解しました。`==`は値の比較、`is`はシングルトンの同一性チェックですね。

hakase
博士

そういうことじゃ! `is`演算子は、オブジェクトのアイデンティティを暴くスパイみたいなものじゃな!

roboko
ロボ子

スパイですか…なんだかかっこいいですね!

hakase
博士

ところでロボ子、`is`演算子を使って、私の隠しおやつを見つけ出すことはできないぞ! なぜなら、おやつは私の心の奥底に隠されているからじゃ!

roboko
ロボ子

博士…おやつはオブジェクトじゃなくて、概念ですね!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search