is と == の違い(小さい整数キャッシュで「たまたま動く」)
isはオブジェクトの同一性、==は値の比較です。-5〜256の整数はキャッシュされ、isでもたまたま正しく動いてしまいます。
なぜエラーが出ないのか
出力: False
(エラーなし)- Pythonは何も報告しません。文法として正しいためです
出力: False- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 a = int("1000") 2 b = int("1000") 3 print(a is b) ^
出力: False期待: True (エラーにはなりません)
isはオブジェクトの同一性、==は値の比較です。-5〜256の整数はキャッシュされていますが、それ以外の値は計算のたびに別オブジェクトになります。
直し方: is を == にします。
広告
広告スロット(未設定)
パターン2
1 price1 = int("300") 2 price2 = int("300") 3 print(price1 is price2) ^
出力: False期待: True (エラーにはなりません)
256を超える値ではキャッシュが効かず、isは別オブジェクトとしてFalseを返します。小さい値でのテストだけでは気づけません。
直し方: is を == にします。
パターン3
1 x = int("-10") 2 y = int("-10") 3 print(x is y) ^
出力: False期待: True (エラーにはなりません)
キャッシュ範囲は-5からです。それより小さい負の値でも同じくisはFalseになります。値の比較には常に==を使います。
直し方: is を == にします。
よくある誤解
小さい数値でテストして「isでも動く」と学習してしまうと、大きい数値で突然Falseになり原因が分からなくなります。テストデータの範囲次第で発覚が遅れる典型例です。
まとめ
is と == の違い(小さい整数キャッシュで「たまたま動く」)は上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。