필자는 코드 작성 중, 말이 안되는 곳에서 오류가 발생하는 것을 확인했다.
이해를 돕기 위해 문제되는 곳만 쉽게 코드를 짠 코드 예시를 가져왔다.
예시 1
a = [[1,2,3,4],[5,6,7,8]]
# b에다가 a의 reverse를 넣고
b = reversed(a)
#b가 잘 들어갔는지 출력한 후
#print(list(b))
#zip함수를 통해 원하는 출력값 도출
c = list(zip(*b))
print(c)
예시 2
a = [[1,2,3,4],[5,6,7,8]]
# b에다가 a의 reverse를 넣고
b = reversed(a)
#b가 잘 들어갔는지 출력한 후
print(list(b))
#zip함수를 통해 원하는 출력값 도출
c = list(zip(*b))
print(c)
예시 1)에서 print(c)의 출력값은 [(5, 1), (6, 2), (7, 3), (8, 4)]
예시 2)에서 print(c)의 출력값은 놀랍게도 [] 이었다.
b가 바뀐 요소가 없이 그냥 reversed가 잘 되었는지 확인차 보는 거였는데, 결과값이 달라져 당황했다.
print(list(b))전 후로 b의 타입을 확인해봐도 reverse iterator라는 타입으로 동일했다.
어쩔수 없이 reversed라는 함수를 이해하기 위해 파이썬 사이트를 방문했다.
https://docs.python.org/3.10/library/functions.html#reversed
위에서의 내용을 짧게 해석하자면, reverse iterator를 반환한다하며, 매개변수 값이 될 수 있는 것만 정의되어 있었다.
문제를 발견할수 없었기에
iterator라는 타입에 대해서도 찾아보았다.
https://docs.python.org/3.10/glossary.html#term-iterator
감사하게도 iterator의 정의 뿐만 아니라, 흔히 발생할 수 있는 실수에 대해서도 적혀있었고, 내 문제 또한 이에 해당했다.
iterator 타입은 링크드 리스트 처럼 구현이 되어있어, 한번 서칭하게 되면, 현 주소값이 널값으로 저장되는 것이었다.
단순하게 설명하자면 loop문이나, 다른 어떤 경우라도 이걸 한번 쓰면, 그 다음부턴 빈 배열을 반환한다는 것이다.
다시 위의 코드로 돌아가서의 문제를 보면,
print(list(b))에서
list형 변환이라는 녀석으로 이미 b의 값을 한번 서칭했기 때문에, 다음에 b를 쓰게되면 []값으로 써지기 때문에 마지막 출력코드에서 []라는 충격적인 출력값이 나온것이었다.
결론
iterator 타입의 변수는 한번밖에 못쓰기 때문에
list나 dictionary등으로 바꿔서 쓰자~
'파이썬' 카테고리의 다른 글
파이썬 함수(is, ==의 차이/ 바다코끼리/ suppress[try catch] / big num) (0) | 2024.08.29 |
---|---|
파이썬에서의 모듈러 연산(음의 정수) (0) | 2024.08.02 |
AI 웹 개발 공부 3일 차 (사전 캠프) (0) | 2024.05.31 |
AI 웹 개발 공부 2일 차 (사전 캠프) (0) | 2024.05.30 |
AI 웹 개발 공부 1일 차 (사전 캠프) (0) | 2024.05.29 |