Pythonのid()関数

Pythonのid()関数は、オブジェクトの「識別子」を返します。オブジェクトの識別子は、そのオブジェクトの寿命中に一意で一定であることが保証されている整数です。寿命が重ならない2つのオブジェクトは、同じid()の値を持つ可能性があります。CPythonの実装では、これはメモリ上のオブジェクトのアドレスです。

Pythonのid()を日本語で言い換えてください。オプションは1つだけです。

Pythonのid() – パイソンのアイディー

Pythonは、stringやinteger、tuplesなどの一般的に使用されるデータ型のid()値をキャッシュするため、値が同じであれば複数の変数が同じオブジェクトを参照し、同じid()値を持つことがあります。以下に例を示して確認しましょう。

# integers
a = 10
b = 10
c = 11
d = 12

print(id(a))
print(id(b))
print(id(c))
print(id(d))

出力:

4317900064
4317900064
4317900096
4317900128

‘a’と‘b’のid()の値は同じであり、同じ整数値を持っていることに注意してください。文字列やタプルでも同様の振る舞いが得られるか見てみましょう。

# tuples
t = ('A', 'B')
print(id(t))

t1 = ('A', 'B')
print(id(t1))

# strings
s1 = 'ABC'
s2 = 'ABC'
print(id(s1))
print(id(s2))

結果:

4320130056
4320130056
4320080816
4320080816

出力から明らかなように、Pythonは文字列とタプルオブジェクトをキャッシュし、メモリスペースを節約するために使用している。

キャッシュは不変(immutable)なオブジェクトのみで動作しますが、整数、文字列、タプルは不変です。そのため、Pythonの実装ではキャッシュを利用してメモリスペースを節約し、パフォーマンスを向上させることができます。

私たちは辞書が不変ではないことを知っていますが、要素が同じであっても異なる辞書間でid()が異なるかどうか確認しましょう。

# dict
d1 = {"A": 1, "B": 2}
d2 = {"A": 1, "B": 2}
print(id(d1))
print(id(d2))

出力:

4519884624
4519884768

思った通り、辞書オブジェクトは異なるid()値を返し、キャッシュされていないようです。

カスタムオブジェクトのためのPythonのid()。

カスタムオブジェクトのid()値を取得する簡単な例を見てみましょう。

class Emp:
    a = 0


e1 = Emp()
e2 = Emp()

print(id(e1))
print(id(e2))

出力:

4520251744
4520251856

要約する

Pythonのid()値は、オブジェクトに対して一意で一定の値を保証します。この値を利用して、オブジェクトがメモリ上で同じオブジェクトを参照しているかどうかを確認することができます。

弊社のGitHubリポジトリから、完全なPythonスクリプトとさらに多くのPythonの例をチェックアウトすることができます。

参照:公式ドキュメント

コメントを残す 0

Your email address will not be published. Required fields are marked *