파이썬

reverse iterator등의 Iterator 유의점

zhelddustmq 2024. 7. 17. 11:50

필자는 코드 작성 중, 말이 안되는 곳에서 오류가 발생하는 것을 확인했다.

이해를 돕기 위해 문제되는 곳만 쉽게 코드를 짠 코드 예시를 가져왔다.

 

예시 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

 

Built-in Functions — Python 3.10.13 documentation

Built-in Functions The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order. abs(x) Return the absolute value of a number. The argument may be an integer, a floating poin

docs.python.org

 

위에서의 내용을 짧게 해석하자면, reverse iterator를 반환한다하며, 매개변수 값이 될 수 있는 것만 정의되어 있었다.

문제를 발견할수 없었기에

 

iterator라는 타입에 대해서도 찾아보았다.

https://docs.python.org/3.10/glossary.html#term-iterator

 

Glossary — Python 3.10.13 documentation

The implicit conversion of an instance of one type to another during an operation which involves two arguments of the same type. For example, int(3.15) converts the floating point number to the integer 3, but in 3+4.5, each argument is of a different type

docs.python.org

 

감사하게도 iterator의 정의 뿐만 아니라, 흔히 발생할 수 있는 실수에 대해서도 적혀있었고, 내 문제 또한 이에 해당했다.

iterator 타입은 링크드 리스트 처럼 구현이 되어있어, 한번 서칭하게 되면, 현 주소값이 널값으로 저장되는 것이었다.

 

단순하게 설명하자면 loop문이나, 다른 어떤 경우라도 이걸 한번 쓰면, 그 다음부턴 빈 배열을 반환한다는 것이다.

 


다시 위의 코드로 돌아가서의 문제를 보면,

print(list(b))에서

list형 변환이라는 녀석으로 이미 b의 값을 한번 서칭했기 때문에, 다음에 b를 쓰게되면 []값으로 써지기 때문에 마지막 출력코드에서 []라는 충격적인 출력값이 나온것이었다.

 


결론

iterator 타입의 변수는 한번밖에 못쓰기 때문에

list나 dictionary등으로 바꿔서 쓰자~