본문 바로가기
08.개발&프로그래밍/1.파이썬

7. Python IndexError(시퀀스 인덱스 범위 초과) 완벽 가이드

by JWJ Family 2025. 7. 18.
728x90

이 글에서는 Python에서 리스트, 튜플 등 시퀀스 객체에 유효하지 않은 인덱스로 접근할 때 발생하는 IndexError—“시퀀스 인덱스 범위 초과” 문제의 정의와 원인, 대표 예제, 해결 방법을 상세히 다룹니다. 단계별 실습과 디버깅 팁을 통해 오류를 빠르게 이해하고 해결하는 방법을 배워봅니다. 다음 챕터에서는 KeyError: 딕셔너리에 없는 키 접근 문제를 다룰 예정입니다.

1. IndexError란?

IndexError는 Python 인터프리터가 리스트, 튜플, 문자열 등 시퀀스 타입의 요소에 접근할 때 지정한 인덱스가 해당 시퀀스의 유효 범위를 벗어나면 발생하는 내장 예외입니다. Python의 시퀀스는 0부터 시작하는 인덱스를 사용하며, 인덱스가 음수일 때는 뒤에서부터 요소를 참조하지만, 유효 범위를 벗어나면 언제나 IndexError를 발생시킵니다.

이 예외는 코드 실행 중(runtime)에 탐지되며, 에러 메시지에 ‘list index out of range’ 또는 ‘tuple index out of range’ 등이 표시되어 어떤 시퀀스에서 문제가 발생했는지 알려줍니다.

2. 주요 발생 원인

  • 잘못된 루프 범위: for나 while 루프에서 len() 함수를 사용하지 않아 인덱스 범위를 초과할 때 발생합니다.
  • 삭제·삽입 후 접근: 루프 중 리스트 요소를 pop() 또는 insert()로 변경했을 때 인덱스가 꼬여 오류가 날 수 있습니다.
  • 음수 인덱스 오용: 음수 인덱스가 유효 범위를 벗어나면 양수 인덱스 범위 초과와 동일하게 IndexError가 발생합니다.
  • 고정 인덱스 사용: 동적 길이 시퀀스에서 항상 특정 인덱스를 고정으로 사용할 때 요소 수 변화로 오류가 발생합니다.
  • 슬라이싱 vs 직접 접근 혼동: 슬라이싱(slice)은 범위 초과 시 자동 무시되지만, 직접 인덱스 접근은 예외를 일으킵니다.

3. 실습 예제

아래 코드를 실행하면 IndexError가 발생하는 대표적인 상황을 확인할 수 있습니다.

# 예제 1: 고정 인덱스 접근 오류
lst = [10, 20, 30]
print(lst[3])   # 인덱스 3은 유효 범위(0~2)를 벗어남

# 예제 2: 음수 인덱스 오용
chars = ['a', 'b', 'c']
print(chars[-4])  # -4는 뒤에서 네 번째 요소가 없어 오류 발생

# 예제 3: 루프 중 리스트 변경
data = [1, 2, 3, 4]
for i in range(len(data)):
    data.pop(0)
    print(data[i])  # data 길이가 줄어들어 i가 범위 초과

4. 실행 결과 및 설명

실행 시 터미널에 다음과 같은 메시지가 출력됩니다:

Traceback (most recent call last):
  File "example.py", line 2, in 
    print(lst[3])
IndexError: list index out of range

Traceback (most recent call last):
  File "example.py", line 5, in 
    print(chars[-4])
IndexError: list index out of range

Traceback (most recent call last):
  File "example.py", line 10, in 
    print(data[i])
IndexError: list index out of range

첫 번째 예제에서는 인덱스 3이 리스트의 길이(3)를 초과하여 오류가 발생하며, 두 번째는 음수 인덱스 범위를 벗어난 경우, 세 번째는 루프 도중 시퀀스 길이가 변하면서 발생합니다.

5. 해결 방법 & 디버깅 팁

  1. 인덱스 범위 검사: 접근 전에 0 ≤ i < len(sequence)를 확인하여 예외를 방지합니다.
  2. enumerate() 활용: 인덱스와 값을 동시에 가져와 안전하게 순회합니다.
  3. 슬라이싱 사용 고려: 요소 하나씩 접근할 필요가 없다면 슬라이싱을 사용해 범위 초과를 자동 회피합니다.
  4. try-except 처리: IndexError를 캐치해 사용자 정의 메시지를 출력하거나 대체 로직을 수행합니다.
  5. 테스트 케이스 추가: 경계 인덱스(0, len−1, 음수 인덱스)에 대한 유닛 테스트를 작성해 조기 오류를 발견합니다.

6. 정리 및 다음 단계

이번 챕터에서는 IndexError의 정의와 주요 원인, 실습 예제, 실행 결과, 해결 방법 및 디버깅 팁을 다뤘습니다. 안전한 인덱스 검증과 enumerate(), 슬라이싱 활용으로 오류를 사전에 예방하세요. 다음 챕터에서는 KeyError: 딕셔너리에 없는 키 접근 문제를 심층 분석할 예정이니 많은 기대 부탁드립니다.

반응형