Python ミュータブルとイミュータブル #1

株式会社リュディアです。Python のデータ型をミュータブルイミュータブルという観点からまとめてみたいと思います。数値、文字列、ブール、リスト、タプル、辞書、集合のそれぞれについては過去にまとめた記事へのリンクを本記事の末尾につけていますので参考にしてください。

まずミュータブルという言葉について調べてみましょう。

able or likely to change と記載されています。ミュータブルの意味は変更可能または変更への可能性という意味とのことです。イミュータブル はミュータブルの反義語です。つまり Python のデータ型は変更可能なものと変更不可能なものに分類できるということです。具体的には以下のように分類されます。

ミュータブル:リスト、辞書、集合
イミュータブル:数値、文字列、ブール、タプル

数値型は何とイミュータブルです。私も最初はどういうことか?と思いました。丁寧に見ていきましょう。以下の例を見てください。

a = 5
print(a)
a = 7
print(a)

>> 5
>> 7

数値型は書き換え可能であるように見えます。数値型はミュータブルではないのですかね? 実は Python のミュータブル、イミュータブルというのはオブジェクトの実体を書き換え可能かどうか?を示しています。オブジェクトと書くとわかりにくようであれば a という箱の中身を書き換え可能であればミュータブルと言えます。以下の図のようなイメージです。

画像1

しかし数値型はミュータブルではない、a = 5 の後に a = 7 と書き換えたときに Python では図のような扱いにはなっていないということになります。どうなってるのでしょうか? id( ) という関数を使って調べてみます。以下の例を見てください。

a = 5
print(a, id(a))
a = 7
print(a, id(a))
>> 5 140709832304544
>> 7 140709832304608

id(a) は a を格納する箱の番号を得るための関数です。5 が入っている a と 7 が入っている a の ID が異なることがわかりますね。つまり以下の図のようになっているということです。

画像2

最初に 5 を代入したときの a と、その後に 7 を代入したときの a は異なります。箱、つまりオブジェクトの ID の末尾4桁が違っていることがわかりますね。

通常のプログラミングでは値を上書きしている感覚でコーディングをしても問題ありませんが、実体としては変数 a の値が書き換えられるたびに別な箱が用意され値が格納されているわけです。そのため Python では数値型はイミュータブル、つまり書き換え不可に分類されます。

次回はミュータブルなリスト型について見ていきます。

最後に数値、文字列、ブール、リスト、タプル、辞書、集合のそれぞれについては過去にまとめた記事へのリンクをつけておきます。

では、ごきげんよう。


この記事が気に入ったらサポートをしてみませんか?