Python: オブジェクトのIDを調べる id()

Pythonではすべてのオブジェクトに自動的に管理用のID(identity)が 割り振られます。オブジェクトのIDを調べたい場合は、 id()関数を使用します。

id(オブジェクト)

ID番号はオブジェクトごとに振られ、 値は整数値です。

a = 100
b = 20

print(id(a)) # 140706965663216

print(id(b)) # 140706965660656

ID番号が同じになるケース

変数に別の変数を代入する場合は、 参照先が同じになるのでID番号も同じになります。

次のコードでは、変数aと変数bのID番号は同じです。

a = 100
b = a

print(id(a)) # 140706965663216

print(id(b)) # 140706965663216

変更不可の文字列型の値を変更した場合

Pythonでは文字列型はイミュータブル(変更不可)です。 ですが次のように「s = "a"」の次に「s = "b"」と記述することで変更できます。

s = "a"
s = "b"

「変更不可のはずなのに、変更できてしまう・・・」これはどういうことでしょうか?
これは値を変更するたびに別のオブジェクトIDが割り当てられているからです。

s = "a"

print(id(s)) # 2113170107568

s = "b"

print(id(s)) # 2113170091888

上のコードからわかるように、 変数のIDを調べたところ、同じ変数sでも「s = "a"」の後と、 「s = "b"」の後ではIDが異なっています。 つまり別のオブジェクトです。
コード上は文字列が格納されている変数sの値が変更できるように見えますが、 実際は新しくオブジェクトが作成されています。

Python