Tip:
Highlight text to annotate it
X
ミューテーションが現在のオブジェクトを 変更するものだと解説してきました
しかし文字列を使って行ったものとの違いを 確かめることはできません
新たな変数を挿入することで 違いを確認することができます
前の例に戻りましょう
代入文を追加して新しい変数を挿入します
変数qを挿入すると仮定しましょう
そしてpをqに代入します つまりこのリストのオブジェクトであるpの値が
qが参照するものになるということです
ここで重要なのは代入後に pとqが同じリストを参照しているということです
qの要素の値を1つ変更する代入文を 行ったと仮定します
これでqの要素4が変更されます
これがqの要素4です
その値を新たな感嘆符に変更します
pの値も変更されます
代入文にはpが含まれていませんが
pとqは同じオブジェクトを参照しているので pの変数も変更されることになります
文字列を使用した場合は異なることを確認するために 文字列でこれを試してみましょう
文字列で最初の文字を置き換えるために 代入を使用した場合
何が起きるか予想してみてください
実行してみましょう
エラーが出ました
文字列が変更できないものだったからです
文字列の値を変更する方法はありません
文字列に代入する方法はありませんという エラーが表示されます
これは不変的なオブジェクトなので 代入に対応していません
変更できるオブジェクトと できないオブジェクトの重要な違いは
オブジェクトが変更できる場合は
同じオブジェクトを参照しているかもしれない 他の変数に注意しなければならないことです
そのオブジェクトの値を変えます
変更したと思われる変数だけでなく
他の変数の値にも同じように作用します
この例を確かめてみましょう
pを文字列Helloを含むリストに設定します
新しい変数qを挿入しその変数にpを代入します
pとqの値を出します
pとq両方が文字列Helloを含んでいると 確認できますね
しかしここでゼロの位置にある値を 変更してみましょう
pのゼロの位置にある値に 文字Yを保持する代入を行います
これによってpの値が変更されます
驚くことにqの値も変更されます
代入でqを使用していないにもかかわらず qの値が変更されました
qがpと同じオブジェクトを参照しているからです