id() メモリアドレスの取得

普段あまり意識しないメモリアドレスですが、メモリの量が限られた環境の中ではどのオブジェクトがどれぐらいメモリを使用しているか知っているとハードウェアに優しいシステムを開発することが出来ます。

github

  • githubのjupyter notebook形式のファイルはこちら

google colaboratory

  • google colaboratory で実行する場合はこちら

筆者の環境

!sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.6
BuildVersion:	18G2022
!python -V
Python 3.7.3
a = [i ** 2 for i in range(100)]

id(a)
4506754184

オブジェクトが同一であるかどうかチェックする際に利用します。

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

print('a :',id(a))
print('b :',id(b))
a : 4506838024
b : 4506838024

値が同じだと異なる変数の宣言も同じアドレスが割り当てられる

a = 1
b = 1

print('a =',a)
print('b =',b)
print('同じアドレス')
print('a :',id(a))
print('b :',id(b))
print(id(a) == id(b))
print()

a = 1
b = 2

print('a =',a)
print('b =',b)
print('異なるアドレス')
print('a :',id(a))
print('b :',id(b))
print(id(a) == id(b))
a = 1
b = 1
同じアドレス
a : 4451820960
b : 4451820960
True

a = 1
b = 2
異なるアドレス
a : 4451820960
b : 4451820992
False

代入すると新しいオブジェクトが出来る

a = 1

print('a =',a)
print('a :',id(a))
print()

# aに異なる値を代入
a = 2

print('a =',a)
print('a :',id(a))
a = 1
a : 4451820960

a = 2
a : 4451820992

配列の場合は参照渡しで、参照元が変更されると参照先も変更される

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

print('a =',a)
print('b =',b)
print('a :',id(a))
print('b :',id(b))
print(id(a) == id(b))
print()

a[0] = 5

print('参照元も変更')
print('a =',a)
print('b =',b)
print('a :',id(a))
print('b :',id(b))
print(id(a) == id(b))
a = [1, 2, 3]
b = [1, 2, 3]
a : 4506837320
b : 4506837320
True

参照元も変更
a = [5, 2, 3]
b = [5, 2, 3]
a : 4506837320
b : 4506837320
True

copy()を利用し、明示的に別のオブジェクトを作成する

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

print('a =',a)
print('b =',b)
print('a :',id(a))
print('b :',id(b))
print(id(a) == id(b))
print()

a[0] = 5

print('a =',a)
print('b =',b)
print('a :',id(a))
print('b :',id(b))
print(id(a) == id(b))
a = [1, 2, 3]
b = [1, 2, 3]
a : 4505419144
b : 4505419400
False

a = [5, 2, 3]
b = [1, 2, 3]
a : 4505419144
b : 4505419400
False