今回はPythonの重要な概念であるmutable(ミュータブル)とimmutable(イミュータブル)に
ついて紹介します。
mutable(ミュータブル)とimmutable(イミュータブル)とは
mutableとimmutableとはひとことでいうと以下の通りです。
mutable : 変更可能なオブジェクト
immutable : 変更不可能なオブジェクト
変更可能/不可能なオブジェクトとはなにか、具体的に紹介していきます!
mutableとimmutableの一覧
mutableとimmutableの一覧は以下の図の通りです。
リストや辞書といった要素を追加可能なデータ型がmutableに該当します
mutable(ミュータブル)とは
上述したようにmutableとは変更可能なオブジェクトのことです。
変更可能なオブジェクトとは、オブジェクトの内容をあとから変更できるといことです。
これでもよくわからないと思うので、実際のmutableであるリストを使って説明します。
id 関数を使用し、実際のコードで説明していきます。id関数とは、引数のオブジェクトのIDを取得します。
IDが同じであれば、同じオブジェクトといえます。
nums = [1, 2, 3]
print(f"リストの要素: {nums}")
print(f"id: {id(nums)}") # リストnumsのIDを出力
nums.append(4) # リストnumsに4を追加
print(f"リストの要素: {nums}")
print(f"id: {id(nums)}") # リストnumsのIDを出力
実行結果
リストの要素: [1, 2, 3]
id: 275912752256
リストの要素: [1, 2, 3, 4]
id: 275912752256
リストの要素を追加しても、オブジェクトのIDは変わっていないことがわかります。
つまり、オブジェクトのIDを変更せずにオブジェクトを変更できています。
これを変更可能なオブジェクトといいます。
上記結果を図で表すと以下のようなイメージです。
メモリ上にリストlist
分のメモリを用意し、リストを更新するときは用意したメモリの値を更新します。
そのため、オブジェクトのIDを変えずに、値を変更できています。
immutable(イミュータブル)とは
続いて、immutableについてです。
immutableとは、変更が不可能なオブジェクトのことですが、
変更が不可能なオブジェクトとはどういうことでしょうか。
immutableであるint
を使って説明します!
num = 1
print(f"num: {num}")
print(f"id: {id(num)}") # 変数numのIDを出力
num = 3 # 変数 num の値を変更
print(f"num: {num}")
print(f"id: {id(num)}") # 変数numのIDを出力
実行結果
num: 1
id: 274881417984
num: 3
id: 274881418048
num
に1を代入したときのID(274881417984)と
3を代入したときのID(274881418048)が異なっています。
num
に入れる値を変更するごとにオブジェクトも変更されています
つまり、オブジェクトを変更せずに値を∫変更できないのです。
これを変更不可のオブジェクトといいます。
上記結果を図で表すと以下のイメージです。
変数num
(num=1)を定義したときにメモリを用意します。
num
に3を代入にしたときにもまた別のメモリを用意しているのです。
mutableとimmutableの使いわけ
mutableとimmutableについてわかったところで、
実際のコードを書く上で何を意識する必要があるか疑問があると思います。
そこで、実際のコード上でのmutableとimmutableの使いわけについて紹介します。
mutableのリストとimmutableのint を引数にして、その引数に1を足す
関数add_num
を用意します。
実行結果をみると、mutableのリストの値だけ更新されていることがわかります。
このようにmutableの値であれば、関数内で更新することも可能です。
一方で、immutableの値の場合は、関数内で更新することができないため、注意が必要です。
nums = [1, 2, 3]
num = 1
def add_num(list, num):
list[0] = list[0] + 1
num = num + 1
print(f"リストの要素: {nums}") # リストnumsの要素を出力
print(f"変数 num: {num}") # 変数numの値を出力
add_num(nums, num)
print(f"リストの要素: {nums}") # リストnumsの要素を出力
print(f"変数 num: {num}") # 変数numの値を出力
実行結果
リストの要素: [1, 2, 3]
変数 num: 1
リストの要素: [2, 2, 3]
変数 num: 1
まとめ
mutableとimmutableについて、実際にコードを書く際の使い分けも含めて紹介しました。
mutableとimmutableについて知らなくてもコードは書けますが、
知らないとバグが起きたりしてしまう重要な内容です。
ぜひmutableとimmutableといったPythonの基礎は抑えていきましょう!