はじめに
Python には ミュータブル(mutable)/ イミュータブル(immutable) という概念があります。
これは オブジェクトが「その場で内容を変更できるかどうか」 を表す性質です。
ここでは、ミュータブル/イミュータブルについて説明します。
基本
Python のデータ(値)はすべて オブジェクト です。
オブジェクトはデータ型ごとに、ミュータブルかイミュータブルかが決まっています。
ミュータブル
ミュータブルとは、同じオブジェクトの中身を(in-place に)変更できるということです。
ミュータブルなオブジェクトは、作成後に内容を書き換える操作ができます。
例:リスト(list)
A = [1, 2, 3]
A[0] = 4
print(A) # [4, 2, 3]
- リストはミュータブルなので、
A[0] = 4のように 同じリストオブジェクトの要素を変更できます。 - これは「変数
Aを書き換えた」のではなく、Aが参照しているリストオブジェクトの中身を変更したということです。
イミュータブル
イミュータブルとは、同じオブジェクトの中身を(in-place に)変更できないということです。
イミュータブルなオブジェクトは、作成後に内容を書き換える操作ができません。
例:文字列(str)
s = "hello"
print(s.replace("hello", "world")) # world
print(s) # hello
-
replaceは「元の文字列を変更する」メソッドではなく、置換後の新しい文字列を返すメソッドです。
したがって、s自体は変わりません。
文字列を「変えたい」場合は、**結果を変数に再束縛(再代入)**します。
s = s.replace("hello", "world")
print(s) # world
また、文字列はイミュータブルなので、次のように要素を書き換えることはできません。
s[0] = "A" # TypeError
- イミュータブルとは、オブジェクト自体を in-place に書き換えられないという性質です。
まとめ
- ミュータブル/イミュータブルは オブジェクトの性質です。
- 変数がミュータブル/イミュータブルになるわけではありません。
- Python の代入は「変数に値を入れる」ではなく、**名前をオブジェクトに束縛する(参照を張る)**ことです。
- 変数はいつでも別のオブジェクトに **再束縛(再代入)**できます。
以上、Python のミュータブル/イミュータブルについて説明しました。