안녕하세요.
오늘은 백준 알고리즘을 풀며 만났던 TypeError: cannot unpack non-iterable int object 에 대해 글을 써보려 합니다.
먼저, 해당 에러를 접한 상황은 다음과 같습니다. (백준 알고리즘 1916번, 18352번)
저는 deque에 (distance,node)의 값을 넣고, pop() 할 때마다 두 값을 한번에 얻고 싶었습니다. 다음과 같이 말이죠.
q = deque((distance,node))
newDistance , newNode = q.pop()
하지만, TypeError가 발생하여서 문제는 풀어야해서 항상 다음과 같이 풀었습니다.
q = deque()
q.append((distance,node))
newDistance , newNode = q.pop()
print(newDistance,newNode)
문제를 풀고 나서, 왜 그렇지 하고 여러가지 테스트를 해보았는데 역시나.. deque를 잘못사용하고 있었습니다.
테스트를 위해 아래와 같이 코드를 돌려보았습니다.
q = deque((0,99))
print(q)
q = deque([0,99])
print(q)
q = deque([(0,99)])
print(q)
그랬더니 위와 같은 결과 값이 나왔습니다. 여기서 아뿔사 했습니다..(역시 기본이 제일 중요하다는 것을 뼈저리게 느끼며...)
파이썬의 deque() 함수는 선언할 때 들어왔던 인자를 자동으로 deque화 시켜서 저장한다는 것을 놓쳤던 것입니다.
다음과 같이 사용하면, q[0]에 0이 q[1]에 99가 들어가는 것이죠.
print를 통해 출력해보면 이런 결과값이 나옵니다.
q = deque((0,99))
print(q[0],q[1])
q = deque([0,99])
print(q[0],q[1])
q = deque()
q.append((distance,node))
newDistance , newNode = q.pop()
***
(3번째줄) 이렇게 사용한다면, 입력받고자 하는 변수 갯수와 입력하고자 하는 변수 갯수가 맞지 않기 때문에 Error가 발생하는 것이었습니다.
'TypeError: cannot unpack non-iterable int object' -> ' iterable 하지 않은 int형 객체를 unpack 할 수 없다' Error 내용은
입력하고하 하는 변수 갯수는 1개인데, 입력받고자 하는 변수 갯수가 2개 여서 값을 할당할 수 없다라는 것입니다.
그렇다면 제가 의도한 방식대로 하려면 어떻게 했어야 할까요?
정답은 다음과 같이 [] 안에 다시 tuple형태로 감싸서 값을 담는 것입니다.
q = deque([(0,99)])
한번 값을 확인해보면 다음과 같이 나옴을 알 수 있습니다.
q = deque([(0,99)])
print(q)
distance , node = q.pop()
print('distance:',distance,'node:',node)
오늘은 deque를 사용하며, 발생했던 TypeError에 대해서 정리해보았습니다.
진짜 오늘도 기본이 중요함을 뼈저리게 깨달으면서 포스팅을 마치겠습니다.
읽어주셔서 감사합니다.
'파이썬 > info' 카테고리의 다른 글
UnboundLocalError: local variable '' referenced before assignment (nonlocal vs global) (0) | 2023.07.03 |
---|---|
[백준 알고리즘] 메모리 초과 발생 이유 및 해결 방안 (2) | 2022.07.08 |
[백준알고리즘] 런타임 에러(RecursionError) 발생 이유 및 해결 방법 (0) | 2022.07.06 |