この記事では、Pythonのオブジェクトの識別値(ID)について解説します。
IDとは、オブジェクトが生成された時に付けられる番号のことでオブジェクトごとに異なるIDを持っています。C言語のアドレスに似ていますが、IDから値にアクセスすることはできません。
IDを比較することで同じオブジェクトかどうかを判定することができます。
それでは、IDを取得する方法とIDを比較する方法を見ていきましょう!
IDを取得する
任意のオブジェクトのIDを取得するには、id()
関数を使います。
id(object)
試しに適当なオブジェクトのIDを調べてみます。
num = 1
print(id(num))
# 140664210856240
num = 2
print(id(num))
# 140664210856272
vals = []
print(id(vals))
# 140664213163968
vals.append(1)
print(id(vals))
# 140664213163968
リストや辞書などのミュータブルなオブジェクトは、要素を追加・削除・変更してもIDは変わりません。逆にイミュータブルなオブジェクトは、同じIDのまま値を変更することができません。
IDを比較する
オブジェクトのIDを比較するには、is
演算子を使います。
n = None
print(n is None)
実行結果
True
None
などの定数は、1つしかオブジェクトが存在しないのでis
演算子で比較できる。True
などにも使用可能ですが、True
として認識される値と比較できなくなるので注意。
n = True
print(n is True)
print(n is 1)
print(n == 1)
実行結果
True
False
True
同じIDを参照するオブジェクト
少し補足的なことですが、イミュータブルな型の同じ値のインスタンスが複数ある場合、同じIDを参照することがあります。
例えば、int
型で同じ値のインスタンスを生成してIDを比較してみます。
num1 = 10
num2 = 10
# is演算子でIDが同じかどうか調べる
print(num1 is num2)
実行結果
True
同じIDを参照していました。
int
型は、メモリ内に「-5 ~ 256」までの整数がいつでも使えるようにあらかじめ用意されています。なので、新しいオブジェクトを生成しておらず、すでに用意されているオブジェクトを参照するのでIDが同じなります。
しかし、他のイミュータブルな型や範囲外(-5~256以外)のint
型の値でも同じIDを参照します。
i1 = 257
i2 = 257
print(i1 is i2)
>> True
f1 = 1.5
f2 = 1.5
print(f1 is f2)
>> True
t1 = (1, 2, 3)
t2 = (1, 2, 3)
print(t1 is t2)
>> True
これは、インタープリタによって同じ値のオブジェクトは同じオブジェクトを使うように最適化されているからです。
ただし、例外としてミュータブルな要素が格納されたタプルは異なるIDを参照します。
t1 = (1, 2, 3, [])
t2 = (1, 2, 3, [])
print(t1 is t2)
>> False