ミュータブルとイミュータブル|Pythonの重要概念

プログラミング知識

Pythonを学習するとき、ぶち当たる壁がミュータブルとイミュータブルです。

解説書には、ミュータブルが可変、イミュータブルが不変などと説明されていますが、とても理解しづらいですよね。

しかしミュータブルとイミュータブルは、Pythonを理解するうえでとても重要な概念になりますので、しっかりマスターしておきましょう。

この記事はこんな人におすすめ
  • Pythonを学んでいるけれど、ミュータブルとイミュータブルの意味がわからない人
  • Python学習者で、もっとPythonについて理解を深めたい人
  • ミュータブルとイミュータブルについて、復習したい人

初心者でもわかりやすいように図解して説明していきます。

Pythonのオブジェクトについて復習

まず、Pythonの基本概念であるオブジェクトについて、復習しておきます。

Pythonでは(というかどのプログラミング言語でも)、プログラムの中で数字や文字などのデータを扱うことができます。

Python上では、これらの”全てのデータ”はオブジェクトと呼ばれる形で実装されています。オブジェクトをイメージにすると次の図のようになります。

オブジェクトの概念

オブジェクトの中にはデータ、属性、関数などが入っています。オブジェクトにはIdentityつまりIDがふられています。

変数は、このオブジェクトに対して貼られたラベルのことで、オブジェクトのIDを記憶しています。変数はラベルですので、一つのオブジェクトに複数つけることができます。

例えば、次のようなプログラムを実行してみてください。

>>> a = 10 >>> b = a >>> id(a) 140725131014176 >>> id(b) 140725131014176

bはaを代入しているので、aもbも10となりますが、IDを確認するとどちらも同じIDを指しています。これは10という値が入ったオブジェクトが存在し、そのオブジェクトに対してaとbというラベルを貼っているイメージになります。

ミュータブルとイミュータブル

ミュータブルとイミュータブルというのは、オブジェクトに対する性質のことになります。

簡潔に言ってしまえば、ミュータブルとはオブジェクト本体は変えずに中身のデータを変更できるオブジェクトであり、イミュータブルとは中身のデータを変更できないオブジェクトのことです。

基本的にオブジェクトは変更できないので、イミュータブルと考えてください。整数、文字列、タプルなどはイミュータブルです。10という整数のオブジェクトがあった場合、そのオブジェクト自体を変更することはできません。11にしたければ新たにオブジェクトが作られることになります。

例えば、次のようなプログラムを実行してみます。

>>> a = 10 >>> id(a) 140725131014176 >>> a = 11 >>> id(a) 140725131014208

aという変数に10を代入したときのIDと、11を代入したときのIDが異なります。これは11を代入するときに新たにオブジェクトが生成されたということを示しています。

文字列でも確認してみましょう。整数と同じように、文字列もIDが変化しました。

>>> str = "abcde" >>> id(str) 2527155670800 >>> str = "abcdef" >>> id(str) 2527155683936
Code language: JavaScript (javascript)

これに対して、リストや辞書はミュータブルになります。

リストは整数(イミュータブル)をメンバに持つことができるのに、ミュータブルというのは不思議です。これはリストはリスト専用のオブジェクトを持ち、そのリストオブジェクトがイミュータブルのオブジェクトを指し示すためです。

ミュータブルオブジェクトのイメージ

リストのミュータブルなオブジェクトは、イミュータブルのオブジェクトを指しているだけなので、自身は変更可能となります。

実際にプログラムで確認してみましょう。

>>> list = [1,2,3] >>> id(list) 2527151612488 >>> list.append(4) >>> id(list) 2527151612488
Code language: PHP (php)

リストのメンバを変更してもリストのIDは変化しません。しかし、次のように記述するとIDが変化します。これはリストのオブジェクト自体を作り直したということになります。

>>> list = [1,2,3] >>> id(list) 2527151612488 >>> list = [2,3,4] >>> id(list) 2527152101640
Code language: PHP (php)

まとめ

ミュータブルとイミュータブルは、Pythonでとても重要な概念になります。特に関数を参照渡しや値渡しといった手法で扱う場合、理解は必須です。

この記事では、初心者でも理解しやすいようにイメージを使って説明しましたので、わかりやすかったのではないかと思います。ぜひ、この機会に理解してしまいましょう。

  • ミュータブルとイミュータブルは、オブジェクトに対する性質を示す。
  • 基本的にオブジェクトはミュータブル。
  • リストや辞書といった別オブジェクトを指すオブジェクトがイミュータブルになる。

コメント

タイトルとURLをコピーしました