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))
PythonIDは変わりません。 → リストは「中身が変わるだけ」で、同じオブジェクトのままです。
イミュータブルの例
x = 10
print(id(x))
x = x + 1
print(id(x))
PythonIDが変わります。 → 数値は「変更」ではなく「新しいオブジェクトの生成」です。
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))
PythonIDが違う → 別のオブジェクト。
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("別のオブジェクトです")
PythonIDを使うと理解が深まる典型例
例:リストの代入と変更
a = [1, 2]
b = a
b.append(3)
print(a) # [1, 2, 3]
print(b) # [1, 2, 3]
PythonIDが同じ → どちらも同じリストを参照しているため、変更が共有されます。
例:文字列の変更
s = "hello"
print(id(s))
s = s + " world"
print(id(s))
PythonIDが変わる → 文字列はイミュータブルなので、新しいオブジェクトが生成されます。
まとめ
- Pythonではすべてが「オブジェクト」としてメモリ上に存在します。
id()を使うと、そのオブジェクトの識別番号を確認できます。- 変数は「オブジェクトへのラベル」であり、コピーではありません。
- ミュータブルは「中身が変わってもIDは同じ」、イミュータブルは「変更すると新しいIDになる」。
- IDを確認することで、参照・代入・コピーの挙動を正しく理解できます。
初心者のうちは、わからなくなったら 値・型・IDの3点セット を確認する習慣をつけると、Pythonの挙動が驚くほどクリアになります。
