안녕하세요.

오늘은 백준 알고리즘을 풀며 만났던 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에 대해서 정리해보았습니다.

진짜 오늘도 기본이 중요함을 뼈저리게 깨달으면서 포스팅을 마치겠습니다.

읽어주셔서 감사합니다.

+ Recent posts