![見出し画像](https://assets.st-note.com/production/uploads/images/11769183/rectangle_large_type_2_88a0e671cd92e9160006b91da880ccd3.jpeg?width=1200)
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))
ちなみに、このページでリストのイメージなど掴むといいかもしれませんね。
この記事が気に入ったらサポートをしてみませんか?