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

株式会社リュディアです。Python のデータ型をミュータブルイミュータブルという観点からまとめる #2 です。#1 では例として数値型がイミュータブル、つまり変更不可であることを中心にまとめました。#2 ではミュータブルであるリストを例として詳細に見ていきたいと思います。#1 の記事は以下です。

ミュータブル、イミュータブルは変数の実体である箱が同一か別物かが重要であることは #1 でまとめました。今回はリストについて見てみます。前回と同じく箱、つまりオブジェクトの ID を見てみましょう。以下の例をみてください。

list_fruits = ['Apple', 'Orange', 'Banana']
print(list_fruits, id(list_fruits))
list_fruits[1] = 'Kiwi'
print(list_fruits, id(list_fruits))
>> ['Apple', 'Orange', 'Banana'] 2007473180736
>> ['Apple', 'Kiwi', 'Banana'] 2007473180736

果物を入れているリストの Orange を Kiwi に変更しています。リストを表現する箱、つまりオブジェクトの ID が変更前(2007473180736)、変更後(2007473180736)で一致していることがわかりますね。次の図のようになります。

画像1

これが Python におけるミュータブルな型の内容を書き換える時の振る舞いです。ではリスト list_fruits の要素である文字列はどうなっているのでしょうか?次の例を見てください。

list_fruits = ['Apple', 'Orange', 'Banana']
print(list_fruits, id(list_fruits))
print(id(list_fruits[0]), id(list_fruits[1]), id(list_fruits[2]))
list_fruits[1] = 'Kiwi'
print(list_fruits, id(list_fruits))
print(id(list_fruits[0]), id(list_fruits[1]), id(list_fruits[2]))
>> ['Apple', 'Orange', 'Banana'] 2007472933184
>> 2007473407920 2007450830320 2007473407984
>> ['Apple', 'Kiwi', 'Banana'] 2007472933184
>> 2007473407920 2007473328944 2007473407984

文字列はイミュータブル、つまり変更不可能なので Orange を Kiwi に変更したとしても Orange の領域を Kiwi に変更しているわけではなく Orange と Kiwi は別の ID を持つ箱、つまりオブジェクトになっていることがわかります。次の図のようなイメージです。今回の例でミュータブルとイミュータブルの感覚がつかめましたか?

画像2

通常の Python プログラミングではミュータブル、イミュータブルを意識する必要はありません。しかし変数の実体がどのようになっているかを意識する必要のあるプログラミング領域も存在します。2 回に渡ってまとめたイミュータブル、ミュータブルな型については知っておくべきだと思います。

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

では、ごきげんよう。


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