일반적인 Python iterator는 현재 위치를 유지하는 한 방향 객체입니다. iterator를 끝까지 소비한 뒤 같은 객체를 다시 순회하면 남은 값이 없으므로 결과는 비어 있습니다. 원본 리스트는 남아 있으므로 그 리스트에서 새 iterator를 만들면 처음부터 다시 읽을 수 있습니다.

컨테이너와 iterator를 같은 객체로 생각하지 마세요. 코드에서 iter(container)가 다시 호출되는지, 이미 소비한 iterator 변수가 재사용되는지 추적해야 합니다.

iterable은 반복자를 만들고 iterator는 진행 위치를 가집니다

리스트는 반복 가능한 컨테이너입니다. 리스트에 iter()를 적용하면 그 원소를 차례대로 내주는 iterator가 만들어집니다. next()나 for 문이 값을 요구할 때마다 iterator의 위치는 앞으로 이동합니다. 끝에 도달하면 더 내줄 항목이 없고 StopIteration이 발생합니다. 일반적으로 같은 iterator를 다시 순회해도 위치가 처음으로 돌아가지는 않습니다. 반면 리스트 원본에는 항목이 그대로 남아 있으므로 리스트에서 새 iterator를 만들면 처음 항목부터 다시 시작합니다.

next와 두 번의 소비를 차례로 계산합니다

교육용 예시이며 공식 기출이나 유료 카드 문항이 아닙니다.
items = ["A", "B"]
it = iter(items)
first = next(it)
rest = list(it)
again = list(it)
restart = list(iter(items))
동일 iterator와 새 iterator 결과
표현결과이유
next(it)A현재 첫 항목을 소비
list(it)[B]남은 항목을 끝까지 소비
list(it)[]iterator가 이미 소진됨
list(iter(items))[A, B]컨테이너에서 새 iterator 생성

첫 next가 A를 소비하므로 iterator에는 B가 남습니다. 첫 list(it)가 그 B를 읽고 끝까지 이동시킵니다. 다음 list(it)는 같은 위치에서 이미 끝난 iterator를 읽으므로 빈 목록을 만듭니다. 그러나 items는 리스트 그대로 유지되어 있으므로 iter(items)를 새로 만들면 다시 A, B를 읽을 수 있습니다. 반복 결과가 필요한 만큼 남아 있는지 볼 때에는 원본 컨테이너와 iterator 변수의 이름을 분리해 적으면 좋습니다.

소비 위치를 한 칸씩 기록합니다

  1. 변수에 들어 있는 값이 리스트 같은 컨테이너인지 iterator인지 확인합니다.
  2. next, list, for, sum 등 값을 소비하는 연산을 표시합니다.
  3. 각 소비 이후 iterator가 가리키는 다음 위치를 기록합니다.
  4. 다시 시작하려면 원본 iterable에서 iter()를 호출하는지 확인합니다.

반복 가능한 객체와 iterator를 혼동하지 않습니다

예제는 리스트에 iterator를 적용하는 일반적인 경우로 한정합니다. 본문은 iterator protocol의 기본 동작을 설명합니다. 실기 출력 문제에서는 iter()가 호출된 위치와 값을 소모하는 함수 호출을 코드에 표시한 뒤 결과를 계산하세요.

iterator는 보통 앞으로만 이동하는 읽기 위치를 나타내므로 먼저 반복 가능한 원본과 iterator 변수를 구분합니다. 리스트처럼 다시 사용할 수 있는 원본에서는 반복마다 새 iterator를 얻습니다. 파일이나 생성기처럼 한 번만 읽는 입력을 재사용하려면 원본을 다시 열거나 필요한 값을 따로 보관할 수 있습니다. 이미 소비한 iterator 자체를 복사해 시작 위치로 돌릴 수 있다고 가정하지 마세요. 반대로 큰 스트림을 여러 번 읽지 않는데도 무조건 리스트로 바꾸면 메모리를 더 사용할 수 있습니다. 재순회 여부와 입력 크기를 함께 고려해 자료형을 선택하세요.

정답을 가리고 확인해 보세요

이 글을 위해 만든 학습 예시이며 공식 기출문제나 판매 카드의 인용이 아닙니다.

iterator가 두 항목을 모두 내준 뒤 같은 iterator를 다시 list()에 전달하면 결과는 무엇인가요?

정답과 해설 확인빈 리스트입니다. 원본 iterable에서 새 iterator를 만들어야 처음부터 다시 소비할 수 있습니다.

Python 3.12의 iterator 프로토콜은 다음 값이 없을 때 StopIteration을 내며, 일반 iterator는 소비 위치를 유지합니다. 리스트 컨테이너와 iterator를 구분해야 합니다.