Code Fix

上級

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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)