id()を使う
Pythonの id() は、初心者が早い段階で理解しておくとコードの挙動が一気に読み解きやすくなる重要な関数です。 id() は「オブジェクトがどこに存在しているか」を示す 識別番号(メモリアドレスのようなもの) を返します。 これにより、同じ値でも別のオブジェクトなのか、まったく同じオブジェクトなのか を見分けることができます。
この解説では、id() の基本から応用、is との関係、初心者がつまずくポイント、実務での使いどころまでをステップバイステップで丁寧に説明します。
id()とは何か
id() は、オブジェクトの「同一性(identity)」を表す一意の番号 を返す関数です。
id(10)
id("hello")
id([1, 2, 3])
PythonPython内部では、すべてのオブジェクトが「どこにあるか」を識別するための番号を持っています。 id() はその番号を確認するためのツールです。
ステップバイステップで理解する id()
ステップ1:基本的な使い方
a = 10
print(id(a))
Pythonステップ2:同じ値でもオブジェクトが違う例
x = [1, 2]
y = [1, 2]
print(id(x))
print(id(y))
Python結果は異なる番号になります。 理由:リストは別々に作られたため、別のオブジェクトだからです。
ステップ3:同じオブジェクトを参照する例
a = [1, 2]
b = a
print(id(a))
print(id(b))
Python結果は同じ番号になります。 理由:a と b は同じオブジェクトを参照しているためです。
id() と is の関係(重要)
is は「id が同じかどうか」を比較する
a is b
Pythonこれは内部的には次と同じ意味です。
id(a) == id(b)
Pythonつまり、is は「同じオブジェクトかどうか」を判定するための構文です。
深掘り:== と is の違い
- ==:値が同じかどうか
- is:オブジェクトが同じかどうか(id が同じかどうか)
a = [1, 2]
b = [1, 2]
a == b # True(値が同じ)
a is b # False(別オブジェクト)
PythonPythonの「オブジェクト再利用(interning)」と id()
Pythonは一部の値を内部で再利用します。
小さな整数
a = 10
b = 10
a is b # True のことがある
Python短い文字列
s1 = "abc"
s2 = "abc"
s1 is s2 # True のことがある
Python深掘り:なぜ再利用するのか
- メモリ節約
- 処理速度向上
ただし、これは Python の内部仕様であり、値の比較に is を使うべきではない理由でもあります。
実務で役立つ id() の使い方
① デバッグで「どのオブジェクトを参照しているか」を確認
print(id(obj))
Python② ミュータブル(変更可能)なオブジェクトの挙動確認
lst = [1, 2]
print(id(lst))
lst.append(3)
print(id(lst)) # 同じ id(同じオブジェクト)
Python③ イミュータブル(変更不可)なオブジェクトの挙動確認
x = 10
print(id(x))
x += 1
print(id(x)) # 別の id(新しいオブジェクト)
Python④ キャッシュや参照の確認
if obj is cached_obj:
print("キャッシュを使います")
Pythonid() を使った安全なコード(セキュリティ視点)
① 同じオブジェクトを参照しているか確認
キャッシュや設定オブジェクトの誤参照はセキュリティリスクになります。
if config is default_config:
print("デフォルト設定を使用しています")
Python② ミュータブルなオブジェクトの共有を検出
if id(user_data) == id(global_cache):
raise SecurityError("データが共有されています")
Python③ None の判定は is を使う(id が同じだから)
if value is None:
...
Python初心者がつまずくポイント(深掘り)
① id() は「メモリアドレスそのもの」ではない
Pythonが内部で管理する識別番号であり、実際の物理アドレスとは限りません。
② 値が同じでも id が違うことがある
[1, 2] と [1, 2]
Python③ 再利用される値があるため is を使うと危険
a = 1000
b = 1000
a is b # False のことがある
Python④ ミュータブルとイミュータブルで挙動が違う
- リストは変更しても id が変わらない
- 数値や文字列は変更すると新しいオブジェクトになる
id() テンプレート(そのまま使える)
オブジェクトの識別番号を確認
print(id(value))
Python同じオブジェクトか確認
if id(a) == id(b):
print("同じオブジェクトです")
Pythonミュータブルの挙動確認
print(id(lst))
lst.append(1)
print(id(lst))
Pythonイミュータブルの挙動確認
print(id(x))
x += 1
print(id(x))
Python実践例
例1:参照の確認
a = [1, 2]
b = a
print(id(a), id(b)) # 同じ
Python例2:値は同じでも別オブジェクト
x = [1, 2]
y = [1, 2]
print(id(x), id(y)) # 違う
Python例3:イミュータブルの挙動
n = 10
print(id(n))
n += 1
print(id(n)) # 別の id
Pythonまとめ
- id() は「オブジェクトの識別番号」を返す
- is は「id が同じかどうか」を比較する構文
- 値の比較は ==、オブジェクトの比較は is
- ミュータブルとイミュータブルで id の挙動が異なる
- デバッグやセキュリティチェックで非常に役立つ
id() を理解すると、Pythonのオブジェクトモデルが一気にクリアになり、バグの原因を見抜く力が大きく向上します。
