Mutableの特徴
・変更が可能なオブジェクト
・list/dict/setが当てはまる
def list_add(num1, num2): num1.append(num2) return num1 list_a = [1,2,3,4,5] list_b = list_add(list_a, 6) list_b => [1,2,3,4,5,6] list_a => [1,2,3,4,5,6]
list_add関数の第一引数はlist_aの値ではなく、どこにlist_aが格納されているか、その参照先を渡すという参照渡しをしている(id(list_a)の結果出てくる場所)。そのため、list_addでlist_aに6を追加してlist_bに代入しているが、これはlist_aの参照先自体に6をプラスしている。なので、6を加えた後、list_aを出力すると、1~6が表示される。結果id(list_a)=id(list_b)は同じということになる。
Immutableの特徴
・変更が不可なオブジェクト
・integer/float/bool/string/tupleが当てはまる
def add_num(num1, num2): num1 += num2 return num1 num_x = 5 num_y = add_num(num1, num2=6) num_y => 11 num_x => 5
対してこちらは、add_num関数の第一引数に渡されるものは、num1の参照先ではなく、num1に代入されている値そのものである。そのため、add_num関数でnum_xに6を足してnum_yに代入すると、num_xとnum_yは別の保存先に格納される(id(num_x)とid(num_y)は別物ということになる)。当然、num_xとnum_yが別個体で格納されているため、num_xの出力は5になり、num_yの出力は11となる。