勉強

MutableとImmutableの違い

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となる。