リストがあるとします:
L = [1,2,3]
L[0]
そして私は変数に割り当てましたa
a = L[0]
その後、変更a
しても影響はありませんL
。
a = a + 1
print L # [1,2,3] not affected
なぜこうなった?Pythonはすべてを参照で渡しているのではないですか? 私はそれa
が指していると思いましたL[0]
問題は、a
とL[0]
が不変オブジェクトへの参照であるため、それらのいずれかを変更しても他の参照には影響しないことです。
>>> L = [1, 2, [3]]
>>> a = L[0]
>>> a = a + 1
a
は新しいオブジェクトをL[0]
指すようになりましたが、それでも同じオブジェクトを指しています。
>>> a, L[0]
(2, 1)
この場合b
、 とL[2]
は変更可能なオブジェクト ( list
) への参照であり、それらに対するインプレース操作はすべての参照に影響します。
>>> b = L[2]
>>> b.append(4) #list.append is an in-place operation
>>> b, L[2]
([3, 4], [3, 4])
>>> b = b + [5] #mutable object, but not an in-place operation
>>> b #b is assigned to new list object
[3, 4, 5]
>>> L[2] #L[2] is unchanged
[3, 4]
割り当てを次のように変更します。
a = L
L を次のように変更すると、次のようになります。
L[0] += 1
a も変化することがわかります。これが参照マジックです。