Pythonの「ミュータブル」と「イミュータブル」を整理してみた
Pythonを使っていると、「ミュータブル(mutable)」と「イミュータブル(immutable)」という言葉に出会うことがあります。
久々にその言葉を聞いた時に、ミュータブルとイミュータブルってなんやったっけとなったので、その違いを備忘録としてまとめました。Python初心者の方にも参考になればうれしいです。
🔁 ミュータブル(mutable)
作成したオブジェクトの状態を変更できる性質のこと。
以下のような型がミュータブルに該当します:
-
list
(リスト) -
dict
(辞書) -
set
(集合)
✅ リストの例
my_list = [1, 2, 3]
my_list.append(4) # 要素を追加
my_list[0] = 10 # 要素を変更
print(my_list) # 出力: [10, 2, 3, 4]
✅ リストの参照渡し
a = [5] # メモリ上に [5] というリストオブジェクトを作成
b = a # 新しいリストオブジェクトは作成されず、b も a と同じオブジェクトを参照
b.append(10) # b が参照しているリストオブジェクト自体を変更
print(a) # 出力: [5, 10]
✅ 辞書の例
my_dict = {'a': 1, 'b': 2}
my_dict['c'] = 3 # 新しいキーと値を追加
my_dict['a'] = 10 # 既存の値を変更
print(my_dict) # 出力: {'a': 10, 'b': 2, 'c': 3}
✅ 集合の例
my_set = {1, 2}
my_set.add(3) # 要素を追加
my_set.remove(1) # 要素を削除
print(my_set) # 出力: {2, 3}
🔒 イミュータブル(immutable)
作成したオブジェクトの状態を変更できない性質のこと。
変更しようとすると、新しいオブジェクトが作成されます。
以下のような型がミュータブルに該当します:
-
int
(整数などの数値型) -
str
(文字列) -
tuple
(タプル)
🔸 数値の例
x = 5
y = x
y = y + 1 # yは新しいオブジェクトを参照
print(x) # 出力: 5
print(y) # 出力: 6
🔸文字列の例
s1 = "hello"
s2 = s1
s2 = s2 + " world" # 新しい文字列オブジェクトを作成
print(s1) # 出力: hello
print(s2) # 出力: hello world
🔸タプルの例
my_tuple = (1, 2)
my_tuple[0] = 10 # エラーになります
# TypeError: 'tuple' object does not support item assignment
my_tuple2 = my_tuple + (3,) # 新しいタプルが作成される
print(my_tuple) # 出力: (1, 2)
print(my_tuple2) # 出力: (1, 2, 3)
💡 おわりに
Pythonの「ミュータブル」と「イミュータブル」は、データの扱いやバグの原因を理解する上でとても重要な概念です。
どちらが「変更可能」なのか迷ったときは、このページを思い出してみてください!