파이썬에서 어떤 값을 더할 때 +를 사용하여 새로운 변수에 결과값을 담을 수도 있고 기존에 사용하던 변수에 +=로 값을 대체할 때가 있습니다. 더 나아가 각 리스트를 합칠 때도 사용됩니다. 아래는 리스트를 합치는 예시입니다.

a = [1,2]
b = [3,4]
c = a+b
print(c)
# [1, 2, 3, 4]




a += b
print(a)


# [1, 2, 3, 4]


위 결과만 봤을 때 +와 +=의 차이가 없는 것처럼 확인됩니다. 그러나 아래 예시를 보면 똑같다 라는 가정이 틀렸다는 것을 볼 수 있습니다.

a = [1,2]
b = (3,4)
c = a+b

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list


a += b
print(a)

# [1, 2, 3, 4]


리스트와 튜플로 선언 후 + 연산자로 결과를 새로운 변수 c에 담으려 하면 에러를 반환하는 반면, += 연산자를 사용하여 a 변수에 결과를 반영하면 의도한대로 합쳐진 리스트가 나오는 것을 볼 수 있습니다.


여기서 + 는 __add__ 함수를 호출하고 +=는 __iadd__ 함수를 호출하게 됩니다. 

여기서 + 연산자는 대칭입니다. 대칭이라는 의미는 a+b와 b+a는 항상 같은 결과를 가져와야 합니다. 위와 같이 타입이 다른 경우, 연산자의 좌변과 우변의 선언 순서에 따라 타입이 변경되기 때문에 오류를 발생시킵니다. 

반면 += 연산자는 비대칭입니다. 선언문 왼쪽의 변수타입에 의해 결정이 됩니다. 따라서 a+=b는 a 타입을 유지하게 됩니다.


만약 b+=a 일 경우면 아래와 같은 결과를 반환합니다.

a = [1,2]
b = (3,4)
b += a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate tuple (not "list") to tuple


이처럼 +와 +=는 비슷해 보이지만 동작하는 방식이 다르므로 사용할 때 유의하여 사용해야 합니다.

+ Random Posts