いくつかのサイトで演算子 a += b
が a = a + b
と同じと書いてありますがミュータブルなオブジェクトでは厳密には異なります。
同じオブジェクトを指す変数がある場合は注意が必要です。(NumPy を使ってる人は特に!)
概要
一言でまとめると以下の違いがあります。
ミュータブルなオブジェクトでは、
-
a += b
では代入の前後でa
が指すオブジェクトは変化しない。 -
a = a + b
では代入の前後でa
が指すオブジェクトは変化する。
ただし、イミュータブルなオブジェクトではどちらの場合も変化します(@shiracamusさんのコメントに例があります)。
実験
[1, 2]
に [3]
を追加して [1, 2, 3]
を作成する実験をしてみます。
y
は代入前の x
のオブジェクトを指します。
組み込み関数 id(x)
でオブジェクトのIDを取得できます。
a += b
>>> x = y = [1, 2] # y は代入前の x と同じオブジェクト
>>>
>>> id(x)
4397797440
>>> id(y)
4397797440
>>>
>>> x += [3]
>>>
>>> x
[1, 2, 3]
>>> y # y にも追加されている
[1, 2, 3]
>>>
>>> id(x) # 代入前と同じオブジェクト
4397797440
>>> id(y)
4397797440
a = a + b
>>> x = y = [1, 2] # y は代入前の x と同じオブジェクト
>>>
>>> id(x)
4397797440
>>> id(y)
4397797440
>>>
>>> x = x + [3]
>>>
>>> x
[1, 2, 3]
>>> y # y には追加されていない
[1, 2]
>>>
>>> id(x) # 代入前と異なるオブジェクトを指している
4395937472
>>> id(y)
4397797440