【Python学習帳】015_イミュータブルとミュータブル
初学者を対象としている京都大学の無料Python教材の学習中です。
「プログラミング演習 Python 2021」
Version2021_10_08_01.pdf
をCC-BY-NC-NDライセンスに従って引用します。
本教材での到達目標:
● Python によるプログラムの実行についての基本操作ができるようになる.
● Python プログラムを構成する基本的要素の機能と書式について説明し,例題を用いて実行例を構成できるようになる.
● Python を用いて簡単なプログラムを自ら設計,実装,テストできるようになる.
第4章の勉強中で、代入という操作の意外なほどの難しさを知ったところです。
今回はイミュータブルとミュータブルとは何かを学びます。
4.10.1 数値や文字列はイミュータブル(変更不能)なオブジェクト
4.10.2 リストはミュータブルなオブジェクト
上記2節を比較して読み、実際にIDLEで確認をしてみました。
https://knimest.hatenablog.com/entry/2023/03/19/233634
さて、そもそもの大切な考え方として
Python では変数はデータそのものを持つのではなく,「データの所在」を持って います.
ということを前回に学びました。
リンク:
それを踏まえて値の変更をすると何が起きるのかを以下で見ていきます。
「データの所在」すなわちidを観察します。
Python では数値や文字列は値を変更することが不可能な「イミュータブル」なオブジェクトとして扱われます.
例えばですが、bという変数の数値を変更しようと新たな値を代入する時には、もとの値の「データの所在」先は変更不能なので、別に新たな値の「データの所在」先が作られます。つまりidが変わりますので見てみました。
上のプログラムの 5 行目すなわち
b = 2 は b が 指しているデータ(値は 1)を書き換えるのではなく,2 というデータを別途作成して,その所在を b に代入するのです.
そのため、bのidが変わっていますね。
一方で、
これに対してリストはその要素などの変更を許す「ミュータブル」なオブジェク
トとして扱われます.このため,同じリストへの参照をもつ2つの変数(a, b) があ
るとき,a や b の要素への変更は別の変数の指す内容にも反映されてしまうので
す
これは前回詳しく見たので一部再掲します。
同じリストへの参照をもつ2つの変数(a, b) があるとき,a や b の要素への変更は別の変数の指す内容にも反映されてしまうのです.
しかもidは変わっていませんから「データの所在」が変わっていないけれど要素などの変更ができていることが分かります。これがミュータブルなオブジェクトの特徴となります。
果てしなく深く掘り下げたい方はこちらをどうぞ
簡潔に図入りでわかりやすいなと思った記事はこちら。
タプルはまだ習ってないんですが、また後日。
また、次回はさらにこのミュータブルなリストの操作で浅いコピーと深いコピーという考え方を学びます。
a = [[1, 2], [3, 4]]
b = a.copy()
としたのちに、bへの代入操作として以下の二つを行った時にaとbがどうなるか予想した上で、次回へ。
b.append([5, 6])
b[0][0] = 0