イミュータブルなオブジェクトを参照する変数に代入

イミュータブルなオブジェクトを指す変数に代入した時の動作について書きます。

イミュータブルなオブジェクトは、値を書き換えることができないオブジェクトであり、int型、str型等のオブジェクトはイミュータブルです。

pythonでは「変数 = イミュータブルなオブジェクト」とすることで、変数はオブジェクトを参照するようになります。C言語などで「変数 = 5」とすると値が変数に渡されますが、pythonでは動作が異なるので注意が必要です。pythonのオブジェクト参照については、Real PythonのObject Referencesが参考になります。

下記、変数が参照するオブジェクトが変わる過程がわかるコードです。

#123の値を持つint型オブジェクトが生成されます。
#aは生成されたint型オブジェクトを参照します。
a = 123

#idはオブジェクトの識別値で、オブジェクトの有効期間中は一意かつ定数です。
#aはint型オブジェクト123を参照しているので、そのidを持っています。
#出力:123 9788768
print(a, id(a))

#aがstr型オブジェクトの"hello"を参照する様にします。
#aが参照するオブジェクトが変わったので、aのidが変化しています。
#出力:hello 140123479208880
a  = "hello"
print(a, id(a))

#現在、aは"hello"を参照しているので、aのidとhelloのidは一致しています。
#出力:hello 140123479208880
print("hello", id("hello"))

#123を持つint型オブジェクトの値が変化したわけではないので、idは「a = 123とした時のaのid」と一致しています。
#出力:123 9788768
print(123, id(123))

コメント

タイトルとURLをコピーしました