1. はじめに
Pythonには、変数やオブジェクトの「識別値(identity)」を確認できる便利な関数があります。それがid()関数
です。
本記事では、Python|オブジェクトの「識別値(identity)」を取得する:id()関数というタイトルの通り、id()
関数の基本的な使い方から、よくある応用例、注意点まで丁寧に解説します。
「id()関数って何に使うの?」「同じ値でも別のオブジェクトなの?」といった疑問を持つ方に向けて、Pythonのメモリ管理の基本的な理解をサポートする内容になっています。
2. id()関数の基本:Pythonオブジェクトの識別子を取得
id()関数とは?
Pythonのid()
関数は、オブジェクトの一意な識別値を返します。この識別値は、通常はオブジェクトがメモリ上に格納されているアドレスに基づいています。
基本構文は以下の通りです。
id(object)
基本的なコード例
同じ数値を代入しても、変数が同じオブジェクトを参照しているかどうかを調べられます。
a = 10
b = 10
print(id(a))
print(id(b))
実行結果:
140710870032112
140710870032112
上記のように、aとbは同じオブジェクト(同じID)を参照していることがわかります。Pythonでは、小さな整数値(-5〜256)はキャッシュされているため、このような現象が起きます。
リストなどのミュータブル(可変)型の場合
x = [1, 2, 3]
y = [1, 2, 3]
print(id(x))
print(id(y))
実行結果:
140711111123456
140711111654321
リストなどのミュータブルなオブジェクトは、内容が同じでも異なるIDを持つため、別のオブジェクトとして認識されます。
3. よくある使い方・応用例
同一性の確認に使う(is演算子との併用)
Pythonでは、==
は「値の比較」、is
は「同じオブジェクトかどうかの比較」です。id()
はis
と連動して使うことで、より直感的に動作を理解できます。
a = [1, 2, 3]
b = a
c = [1, 2, 3]
print(a is b) # 同じオブジェクト
print(a is c) # 内容は同じだが別オブジェクト
print(id(a), id(b), id(c))
実行結果:
True
False
140711100000000 140711100000000 140711199999999
関数内でのオブジェクトのID変化を確認
引数として渡されたリストを変更した場合、元のリストと同じオブジェクトを指しているかどうかを確認できます。
def modify_list(lst):
print("関数内 ID:", id(lst))
lst.append(100)
my_list = [1, 2, 3]
print("関数前 ID:", id(my_list))
modify_list(my_list)
print("関数後 ID:", id(my_list))
実行結果:
関数前 ID: 140710000111111
関数内 ID: 140710000111111
関数後 ID: 140710000111111
このように、ミュータブル型は関数内でもIDが変わらないため、元のオブジェクトが直接変更されることが分かります。
4. 注意点・エラー対策
同じ値でもIDが異なるケースに注意
以下のように、リストや辞書などの可変オブジェクトは、見た目が同じでも新たに作成されれば別IDになります。
list1 = [1, 2, 3]
list2 = list1.copy()
print(id(list1))
print(id(list2))
実行結果:
140710999888888
140710999999999
初心者が「同じ値なのにIDが違う!」と戸惑うポイントです。
数値や文字列のキャッシュに注意
Pythonでは、頻繁に使われる小さな整数(-5〜256)や短い文字列などはキャッシュされるため、id()
が同じになることがあります。
x = "hello"
y = "hello"
print(id(x), id(y))
実行結果:
140710876543210 140710876543210
これは最適化の一環で、Pythonの仕様によるものです。
5. まとめ
id()
関数は、Pythonオブジェクトの「識別値」を取得するために使う- イミュータブルなオブジェクト(数値・文字列)はキャッシュされることがある
- 同じ内容でも別オブジェクトならIDは異なる
is
演算子と一緒に使うと便利
Pythonのid()
関数は、同一性の確認やメモリの理解に役立つ重要なツールです。特に関数やオブジェクトの動作を深く理解したいときに活用できます。
学習のコツとしては、「なぜ同じ値でIDが違うのか」「逆になぜ違う変数でIDが同じなのか」を考えることで、Pythonの設計思想が見えてきます。
実務でも、デバッグ時に意図しないオブジェクト参照を見つける手がかりとしてid()
関数が役立つことがあります。ぜひ覚えておきましょう!