破壊的に中身を変更できるlistとできないtupleを比較してみてください。
>>> tuple1 = (1, 2, 3)
>>> tuple2 = (4, 5, 6)
>>> tuple3 = tuple1 + tuple2
>>> print(tuple3)
(1, 2, 3, 4, 5, 6)
>>> tuple4 = tuple3
>>> print(id(tuple3))
4358041504
>>> print(id(tuple4))
4358041504
>>> tuple3 += (7, 8, 9)
>>> print(tuple3)
(1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> print(tuple4)
(1, 2, 3, 4, 5, 6)
>>> print(id(tuple3))
4347223376
>>> print(id(tuple4))
4358041504
破壊的に中身を変更できないtupleでは+=
で中身の変更は起きません。
tuple3 += (7, 8, 9)
を実行しても、元のオブジェクトは変化せず新しいオブジェクトが再束縛されています。
実行前と後でid
関数の返り値が違うことが分かります。
>>> list1 = [1, 2, 3]
>>> list2 = [4, 5, 6]
>>> list3 = list1 + list2
>>> print(list3)
[1, 2, 3, 4, 5, 6]
>>> list4 = list3
>>> print(id(list3))
4354511168
>>> print(id(list4))
4354511168
>>> list3 += [7, 8, 9]
>>> print(list3)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print(list4)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print(id(list3))
4354511168
>>> print(id(list4))
4354511168
破壊的に中身を変更できるlistでは+=
で中身の変更が起きています。
list3 += [7, 8, 9]
を実行しすると、元のオブジェクトが変化するだけで新しいオブジェクトの再束縛は起きません。
実行前と後でid
関数の返り値が同じことが分かります。
同じオブジェクトに束縛されているlist4
を評価すると同じように変化しています。
https://docs.python.org/ja/3/reference/simple_stmts.html#augmented-assignment-statements
また、実際の処理として、可能ならば インプレース (in-place) 演算が実行されます。これは、代入時に新たなオブジェクトを生成してターゲットに代入するのではなく、以前のオブジェクトの内容を変更するということです。
「可能ならばインプレース演算が実行されます」と書いてあります。可能でないならインプレース演算にはならないということでもあり、tupleでは実際インプレース演算になりません。