見出し画像

Pythonの基礎#11「ミュータブルとイミュータブル」

変数について、ちょっと詳しく調べてみましょう。Pythonでは、変数は全てオブジェクトという考え方です。(オブジェクトについてはまたの機会に説明しますね。)
変数名は箱に名前をつけますが、それはその箱にタグのようについています。

num1 = 10
num2 = num1
print(num1)
print(num2)

変数に別の変数を代入すると同じ箱にそのタグがついて行くイメージです。

では、それが同じ箱かどうか、id()関数を使って調べてみましょう。

num1 = 10
num2 = num1
print(num1)
print(num2)

num1とnum2は同じ値になっています。これは同じ箱にタグがつけられ同じ箱を示しています。

では、num1に何か値を足して再びnum1に保存するとどうでしょう。id値は変わっています。これは別の箱が作られ、その箱にnum1のタグがつけ変わったんですね。

print(id(num1))
num1 = num1 + 20
print(id(num1))

このように後から値を変更した時に、元の箱の中身を変えられないものを「イミュータブル」(変更不可)と言います。
データ型は、2つに大別され、後から箱の内容を変えられない「イミュータブル」と「ミュータブル」(変更可能)です。

リストをみて見ましょう。

num_list = [1,2,3,4,5]
print(id(num_list))
num_list[3] = 40
print(id(num_list))

このように、id値が変わりません。リストは、1階建てのアパートのようなもので一つ一つの要素がお部屋に代入されているイメージでそのアパートにタグがついています。

そして、要素を変更してもid値は変わりません。なので、リストは「ミュータブル」(変更可能)と言われます。アパートのお部屋の内容は変えられます。


しかし。文字列は同じ箱に代入するとid値が変わりますのでイミュータブルです。このイミュータブルの要素を変えようとすると、エラーになります。
イミュータブルは変更できないのです。(変更不可)

元の箱は参照できるのですが、変更保存しようとすると別の箱を作ってしまうので、変更できないんですね。だから変更不可。

でも、文字列の連結はできるんです。その時のid値は、変わっていますね。
id値が変わるとエラーにならず、後から変更ができます。文字列は追加ができる、でも内容の変更はできない、ですね。ちょっと特殊ですね。

また、文字列の内容を変更しようとするとエラーになりますが、内容を読み込んで、連結するのは大丈夫ですよ。連結後は、別の箱になってタグが付け替えられますね。

msg = 'こんにちは'
print(msg)
print(id(msg))
msg = msg + msg[3]
print(msg)
print(id(msg))


ちなみに、このページでリストのイメージなど掴むといいかもしれませんね。


この記事が気に入ったらサポートをしてみませんか?