【Python基礎】mutableとimmutableについて紹介

  • URLをコピーしました!

今回は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の基礎は抑えていきましょう!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

エンジニア。20代。組み込みエンジニアとして働き始めるも、働き方や業務内容に限界を感じ、 AI,Web3エンジニアを目指して勉強中。 エンジニアとして思うことや、学んだことを発信します。

目次