파이썬에서 두 변수의 데이터 타입이 같고, 리스트나 딕셔너리 같은 반복 가능한(iterable) 객체가 아닌 경우에는 a += b와 a = a + b가 동일한 결과를 반환합니다. 하지만 반복 가능한 객체가 연산에 포함되면 항상 같은 결과를 기대할 수 없습니다. 아래는 그 대표적인 예시입니다.
1. a = a + b의 경우
리스트와 문자열을 병합하려고 a = a + b 표현식을 적용하면 어떻게 될까요? 예상과 달리 에러가 발생합니다.
예제 코드
x = 'Hello ' z_list = [1,2,3] z_list = z_list + x print(z_list)
실행 결과
위 코드를 실행하면 다음과 같은 오류 메시지가 출력됩니다.
Traceback (most recent call last):
File "C:\Users\Pradeep\AppData\Roaming\JetBrains\PyCharmCE2020.3\scratches\scratch.py", line 11, in
z_list = z_list + x
TypeError: can only concatenate list (not "str") to list
+ 연산자는 리스트끼리만 결합할 수 있으며, 서로 다른 타입인 리스트와 문자열의 직접적인 병합은 허용하지 않기 때문에 TypeError가 발생하는 것입니다.
2. a += b의 경우
그런데 같은 상황에서 a += b 표현식을 사용하면 결과가 완전히 달라집니다. 문자열이 명시적인 타입 변환 없이도 개별 요소들로 분해되어 리스트에 자동으로 추가됩니다.
예제 코드
z_list = [1,2,3] x = 'Hello' z_list += x print(z_list)
실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻습니다.
[1, 2, 3, 'H', 'e', 'l', 'l', 'o']
문자열 'Hello'가 하나의 값으로 더해진 것이 아니라, 각 글자가 개별 요소로 리스트에 확장되어 들어간 것을 확인할 수 있습니다.
왜 이런 차이가 발생할까?
그 이유는 파이썬 내부적으로 두 연산자가 서로 다른 매직 메서드(특수 메서드)를 호출하기 때문입니다. + 연산자는 __add__() 메서드를 호출하고, += 연산자는 __iadd__()(in-place addition) 메서드를 호출합니다. 리스트의 __iadd__() 메서드는 전달된 객체를 반복 가능한(iterable) 것으로 취급하여 각 요소를 하나씩 리스트에 추가하는 extend()와 유사하게 동작하기 때문에, 문자열이 글자 단위로 분해되어 삽입되는 것입니다.
따라서 실무에서 코드를 작성할 때는 데이터 타입에 따라 +=와 = ... + ...의 동작 차이를 반드시 인지하고 있어야 의도치 않은 버그를 예방할 수 있습니다.