ここでのいくつかの既存の回答とは対照的に、本当の理由は実際には反対です。Python で自分自身+=
を変更するインプレース演算子であることを意図しています。しかし、それにはいくつかの問題があります。
タプルや文字列などの不変型の場合、my_tuple += (1, )
は新しいmy_tuple = my_tuple + (1, )
オブジェクトを作成し、それを に代入します:my_tuple
>>> my_tuple = (1,2,3)
>>> t = my_tuple
>>> t += (2,)
>>> t
(1, 2, 3, 2)
>>> my_tuple
(1, 2, 3)
これは、タプルや文字列などの不変型が実装されていないため__iadd__
です (例で確認できますdir(tuple)
)。この場合、__add__
代わりにフォールバックして使用します。これにより、新しいオブジェクトが作成され、元の変数に割り当てられます。
ただし、リストや辞書などの一部の変更可能な型で__iadd__
は が実装されており、+=
代わりにそれを呼び出します。
>>> inspect.getdoc(list.__iadd__)
'x.__iadd__(y) <==> x+=y'
>>> a = [1,2,3]
>>> b = a
>>> b += [4]
>>> b
[1, 2, 3, 4]
>>> a
[1, 2, 3, 4]
したがって、変更可能な型の場合、このインプレース操作は ( selfを変更することによって) 実行され、元のオブジェクトは update されます。