우리는 파이썬을 처음 배울 때, += 연산자는 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 |
댓글