rohaniのブログ

ゆるっと自然言語処理奴。ときどき工作系バイト。

mutableなオブジェクトとimmutableなオブジェクト

前回の記事で、下記のコードと

def add_hoge(str):
    str += 'hoge'

str = 'hello '
add_hoge(str)
print(str)
#> 'hello '   #'hello hoge'にはならない

下記のコード

def append_hoge(lst):
    lst.append('hoge')

lst = ['hello']
append_hoge(lst)
print(lst)
#> ['hello', 'hoge']  #['hello'] じゃない

について、pythonのリストは参照渡しだからね〜って簡単に思っていたけれど、 よく考えたらどの変数が参照渡しでどの変数が値渡しの挙動をするのか、網羅的に分かってないことに気づいた。

amacbee.hatenablog.com

この辺りについて、上の記事ではとても良くまとまっていた。(本当に助かりました。ありがとうございました。) 最後に出ていた良くある間違いのところ、気付かず書いていた気がして戦慄している。気付かないってことは...ないと思うけど...あれ...

さて、関数への参照渡しと値渡しについてはスッキリしたのだけれど、記事中の

変更不可(Immutable)な型
int, float, str, tuple, bytes, frozenset 等
変更可能(Mutable)な型
list, dict, set, bytearray 等

immutableとmutableについてもう少し良く知っておこうという気持ちになったので、合わせて下の記事も読ませていただいた。

nihaoshijie.hatenadiary.jp

噛み砕いた上で理解しやすいように順序立てて説明してある。(本当に助かりました。ありがとうございました。。) containerのあたりはまだちゃんと勉強したことなかったな、と思った。「mutable objectへの参照を持っているimmutable objectってなに?」の下りは、C言語のポインタ関数とかと同じ肌触りの話なのかなと思った。 copy関数のコードの抜粋のあたりで力(と時間が)尽きてしまったので、覚えておいて先も読もう。な、未来の自分よ。