Python 逆引き集 | Python基礎・実行環境:オブジェクトのIDを確認する

Python Python
スポンサーリンク
スポンサーリンク

Python基礎・実行環境

Pythonを学び始めると、「変数の値はわかるけれど、変数そのものはどう扱われているのか?」という疑問が出てきます。 その理解を深めるために役立つのが オブジェクトのID(識別子)を確認する という考え方です。

Pythonでは、すべての値は「オブジェクト」としてメモリ上に存在し、変数はそのオブジェクトへの“ラベル”にすぎません。 この仕組みを理解すると、Pythonの挙動が一気にクリアになります。

オブジェクトのIDとは何か

Pythonのオブジェクトには、メモリ上で一意に識別するための番号(ID) が割り当てられています。 このIDは、オブジェクトが生成されたときに決まり、通常はそのオブジェクトが存在する間は変わりません。

IDを確認する理由

  • 変数同士が 同じオブジェクトを参照しているか を確認できる
  • ミュータブル(変更可能)なオブジェクトの挙動を理解できる
  • Pythonの内部動作(参照・コピー・代入)を正しく理解できる
  • バグの原因を特定しやすくなる

Pythonの学習で「値は同じなのに挙動が違う」という場面に出会ったとき、IDを確認すると原因がわかることが多いです。

IDを確認する基本:id() 関数

Pythonでは、組み込み関数 id() を使ってオブジェクトのIDを確認できます。

x = 10
print(id(x))
Python

出力例:

140709493829648

これは「x が参照しているオブジェクトのID」です。

実際にIDを確認してみる(例題)

同じ値でもIDが違う場合

a = 1000
b = 1000
print(id(a))
print(id(b))
Python

出力例:

140709493829648
140709493829712

値は同じでも、別々のオブジェクトとして扱われています。

同じオブジェクトを参照している場合

a = [1, 2, 3]
b = a
print(id(a))
print(id(b))
Python

出力例:

140709493830000
140709493830000

IDが同じ → a と b は同じリストを参照している つまり、片方を変更するともう片方にも影響します。

ミュータブルとイミュータブルの違いをIDで理解する

Pythonのオブジェクトには次の2種類があります。

  • ミュータブル(変更可能):list, dict, set など
  • イミュータブル(変更不可):int, float, str, tuple など

ミュータブルの例

lst = [1, 2, 3]
print(id(lst))

lst.append(4)
print(id(lst))
Python

IDは変わりません。 → リストは「中身が変わるだけ」で、同じオブジェクトのままです。

イミュータブルの例

x = 10
print(id(x))

x = x + 1
print(id(x))
Python

IDが変わります。 → 数値は「変更」ではなく「新しいオブジェクトの生成」です。

IDを使って「参照の仕組み」を理解する(重要)

例:変数の代入は“コピー”ではない

a = [1, 2, 3]
b = a
Python

これは「a の中身をコピーする」ではなく、 a と b が同じオブジェクトを参照するという意味です。

IDを確認するとわかります。

print(id(a))
print(id(b))
Python

同じID → 同じオブジェクト。

例:コピーしたいなら copy() を使う

import copy

a = [1, 2, 3]
b = copy.copy(a)

print(id(a))
print(id(b))
Python

IDが違う → 別のオブジェクト。

IDを使ったデバッグテンプレート(そのまま使える)

変数の値とIDをまとめて確認する

def debug(var):
    print(f"value={var}, id={id(var)}, type={type(var)}")

x = [1, 2, 3]
debug(x)
Python

参照が同じか確認する

if id(a) == id(b):
    print("同じオブジェクトを参照しています")
else:
    print("別のオブジェクトです")
Python

IDを使うと理解が深まる典型例

例:リストの代入と変更

a = [1, 2]
b = a
b.append(3)

print(a)  # [1, 2, 3]
print(b)  # [1, 2, 3]
Python

IDが同じ → どちらも同じリストを参照しているため、変更が共有されます。

例:文字列の変更

s = "hello"
print(id(s))

s = s + " world"
print(id(s))
Python

IDが変わる → 文字列はイミュータブルなので、新しいオブジェクトが生成されます。

まとめ

  • Pythonではすべてが「オブジェクト」としてメモリ上に存在します。
  • id() を使うと、そのオブジェクトの識別番号を確認できます。
  • 変数は「オブジェクトへのラベル」であり、コピーではありません。
  • ミュータブルは「中身が変わってもIDは同じ」、イミュータブルは「変更すると新しいIDになる」。
  • IDを確認することで、参照・代入・コピーの挙動を正しく理解できます。

初心者のうちは、わからなくなったら 値・型・IDの3点セット を確認する習慣をつけると、Pythonの挙動が驚くほどクリアになります。

タイトルとURLをコピーしました