"Out of Range"(범위 초과)는 보통 프로그래밍에서 '유효한 범위를 벗어난 인덱스나 값에 접근하려 할 때' 발생하는 오류를 말합니다. 파이썬에서는 대표적으로 IndexError: list index out of range(리스트 인덱스가 범위를 벗어남)처럼 나타납니다. 핵심 내용만 정리하면 다음과 같습니다.
무엇인지
- 시퀀스(리스트·튜플·문자열 등)의 유효 인덱스 범위를 벗어난 위치를 참조하려 할 때 발생하는 오류입니다.
- 파이썬 인덱스는 0부터 시작하므로 길이 N인 리스트의 마지막 인덱스는 N-1입니다(음수 인덱스는 뒤에서부터: -1이 마지막).
주요 원인
- 인덱스를 잘못 계산해서 한 칸 초과(오프 바이 원, off-by-one).
- 빈 리스트에서 요소를 꺼내려 함(len이 0인데 [0] 또는 pop()).
- 반복문 범위를 잘못 설정(for i in range(len(list)+1) 등).
- 외부 데이터(예: split 결과)의 조각 수를 과신하여 고정 인덱스 접근.
- 반복 중 리스트를 수정(popup 등)하여 길이가 바뀜.
슬라이싱과의 차이
- list[i] 같은 단일 인덱싱은 범위를 벗어나면 예외를 발생시키지만,
- list[i:j] 같은 슬라이싱은 범위를 벗어나도 에러가 나지 않고 가능한 부분만 반환합니다(없으면 빈 리스트).
해결·예방 방법(실무 팁)
- 접근 전에 범위 검사: 0 <= i < len(lst) 또는 if i < len(lst): …
- 비어 있을 가능성 검사: if lst: …
- 직접 인덱스 대신 반복문 사용: for x in lst: … (번호가 필요하면 enumerate 사용)
- 마지막 요소는 안전하게: lst[-1] if lst else 기본값
- 슬라이싱 트릭: lst[i:i+1]로 받아서 빈 리스트인지 확인
- 예외 처리: try/except IndexError로 대체 로직 처리
- 외부 입력은 항상 조각 수나 길이를 확인
간단 예시
- 잘못된 경우: fruits = ["사과","바나나","체리"]; print(fruits[3]) → IndexError
- 안전한 접근: if 3 < len(fruits): print(fruits[3]) 또는 print(fruits[3:4]) (빈 리스트가 반환될 수 있음)
정리
- "Out of Range"는 값이 없어서가 아니라 '그 자리는 존재하지 않는다'는 뜻입니다. 대부분 인덱스 계산이 한 칸 어긋난 경우이므로 len(리스트)와 접근하려는 인덱스를 비교해 보면 원인이 금방 드러납니다.
참고 자료