LoginSignup
4
3

More than 3 years have passed since last update.

Pythonの a += b と a = a + b は違う

Last updated at Posted at 2020-09-09

いくつかのサイトで演算子 a += ba = 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]
>>> 
>>> 
[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]
>>> 
>>> 
[1, 2, 3]
>>> y  # y には追加されていない
[1, 2]
>>>
>>> id(x)  # 代入前と異なるオブジェクトを指している
4395937472
>>> id(y)
4397797440
4
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3