본문 바로가기
Python

+= 연산자의 비밀

by 개발자54 2025. 3. 16.

우리는 파이썬을 처음 배울 때, += 연산자는 x += y와 같은 연산을 할 때 아래와 같이 동작한다고 배웠다.

 

x = x + y

 

이를 숙지한 상태에서, 하단 오류 메시지의 원인을 추측해보자.


다음과 같은 상황에서 'int' object is not iterable 에러가 발생했다.

 

empty_lst = []
empty_lst += 1  # ‘int’ object is not iterable

 

empty_lst는 비어있는 list 인데, list에 int값인 1을 더하려고 했기 때문에 오류가 난 것 같다.

그런데, 이 오류 메시지는 잘 생각해보면 납득이 가질 않는다.

list에 int 값인 1을 더하려고 했기 때문에 오류가 난다고 한다면 상식적으로,

 

  • TypeError: can only concatenate list (not "int") to list (왼쪽 피연산자인 list는 list끼리만 연산이 가능하고 int를 허용하지 않음)

위와 같은 TypeError가 나야할 것 같은데, 왜 int가 iterable하지 않다는 오류가 나는 것일까?

앞서, iterable이라는 것은 ‘반복 가능한 객체’라고 배웠다.

(https://fotia.tistory.com/23 참조)

 

도대체 iterable과 += 연산은 무슨 관련이 있는 것일까?

 

이를 살펴보려면 먼저, +=연산에서 int와 list의 동작 방식 차이를 알아야 한다.

 

  • int의 += 연산
two = 2
three = 3
two += three
print(two) # 출력: 5

 

  • list의 += 연산
my_lst = [1, 2]
add_lst = [3, 4]
my_lst += add_lst
print(my_lst) # 출력: [1, 2, 3, 4]

 

여기까지 보면, int와 list 동작 방식이 크게 차이 나지 않는 것 같다. 무슨 차이가 난다는 걸까?

 

다시 글의 처음으로 돌아가보자.

 

우리는 파이썬을 처음 배울 때, += 연산자는 x += y와 같은 연산을 할 때 아래와 같이 동작한다고 배웠다.

 

x = x + y

 

하지만 이는 완전히 정확한 설명은 아니다.

 

실제로 += 연산자는 객체의 타입에 따라 다르게 동작하기 때문이다.

 

  • int에서의 += 연산
a = 2
b = 3
a += b  # a = a + b 와 동일
print(a)  # 5

int는 immutable(불변)한 객체이기 때문에, += 연산을 하면 a가 a + b로 계산된 새로운 값으로 교체된다.

int는 불변(immutable) 객체이므로 __iadd__() 메서드가 존재하더라도 기존 값을 수정하는 것이 아니라 새로운 값을 생성하여 할당한다. 따라서 결과적으로 a = a + b와 동일한 동작을 한다.

 

  • list에서의 += 연산
my_lst = [1, 2]
add_lst = [3, 4]

my_lst += add_lst  # 실제로는 extend()가 호출됨
print(my_lst)  # [1, 2, 3, 4]

list는 mutable(변경 가능)한 객체이기 때문에, += 연산자가 리스트를 직접 수정하려고 한다.

따라서 extend()는 리스트를 직접 수정하는 in-place 메서드이므로, 반드시 iterable한 객체를 입력받아야 한다.

 

empty_lst = []
empty_lst += 1  # ‘int’ object is not iterable

 

위와 같이 empty_lst += 1을 실행하면, 파이썬은 내부적으로 empty_lst.extend(1)을 시도한다.

list에서 extend는 오른쪽 값이 반복 가능한 iterable 객체라고 가정하고 작동한다.

그래서 in-place method(객체의 값을 직접 바꾸는 메서드)인 extend는 iterable한 객체만을 입력받을 수 있는 것이다.

즉, 문제의 핵심은 list에서 += 연산이 extend()로 동작한다는 점에 있다.

따라서 ‘int’ object is not iterable 라는 오류가 발생하는 것이다.

 


사족

 

만약 iterable의 개념을 몰랐고, 관심도 없었다면 저런 에러 메시지가 나와도 아 에러 났나보네, 고쳐야지 하고 끝냈을 것 같은데

iterable이 무엇인지 알고 나니 그냥 지나칠 수 있었던 에러에 의문을 가지게 됐다. 괜히 '기본으로 돌아가라' 라는 말이 있는 게 아닌 것을 느낀 계기였다.

앞으로도 파이썬을 좀 더 파봐야겠다.

'Python' 카테고리의 다른 글

Python의 Iterable과 Iterator  (0) 2025.03.13
Pycharm 유용한 단축키 정리 (수시 업데이트)  (0) 2022.12.06

댓글