zip은 가장 짧은 입력이 끝날 때 멈춘다. 두 입력의 항목 수가 같아야 한다면 strict=True로 길이 차이를 오류로 드러낼 수 있다. 오류는 결과를 순회할 때 발생하므로 그 전에 나온 쌍을 처리했다면 그 처리도 이미 일어났다.
이름 세 개에 수량이 두 개라면
가상의 작업 목록이다. 이름과 수량을 같은 위치끼리 묶으면 두 쌍만 만들어진다.
names = ["초안", "검토", "공개"]
counts = [2, 1]
print(list(zip(names, counts)))
pairs = zip(names, counts, strict=True)
print("생성됨")
try:
for pair in pairs:
print(pair)
except ValueError as error:
print(type(error).__name__)
[('초안', 2), ('검토', 1)]
생성됨
('초안', 2)
('검토', 1)
ValueError
기본 호출에서는 공개에 해당하는 수량이 없어 결과에 빠진다. strict=True에서도 처음 두 쌍은 유효하다. 다음 쌍을 요청하면 수량 쪽이 먼저 끝났다는 사실을 발견한다. Python의 zip 설명은 이 순회 시점과 Python 3.10에 추가된 strict 옵션을 함께 설명한다.
일부만 처리되면 곤란할 때
길이를 알 수 있는 두 리스트라면 처리에 앞서 len을 비교할 수 있다. 항목 수가 적고 유한하지만 길이를 바로 알 수 없는 입력이라면 list(zip(left, right, strict=True))로 쌍을 모두 만든 다음, 성공한 결과만 저장이나 전송에 넘긴다. 이때도 입력 이터레이터는 검증 과정에서 소비된다.
스트림의 길이는 끝에 닿아야 확인할 수 있다. 쌍을 받는 즉시 외부에 쓰는 구조라면 뒤늦게 발견한 오류에 대비해 부분 처리의 책임을 정해야 한다. 두 입력의 길이가 같아도 올바른 항목끼리 연결된다는 보장은 없다. 순서나 키가 계약의 일부라면 그 조건도 따로 확인한다.
코드는 CPython 3.14.3과 Windows 11에서 실행했다. 예제의 오류 출력은 예외 클래스 이름이다.