파이썬 IndexError: list index out of range는 시퀀스에 없는 위치를 단일 인덱스로 읽을 때 발생하며, 먼저 실제 길이와 접근 인덱스를 확인해야 합니다. 자동화 코드에서는 빈 입력, 잘못된 반복 범위, 예상보다 짧은 split() 결과, 비어 있는 pop() 대상이 흔한 원인입니다. 오류를 무조건 try/except로 숨기기보다 입력 조건과 반복 경계를 구분해 고치는 편이 안전합니다.
먼저 확인할 것
오류가 난 줄에서 시퀀스와 인덱스를 함께 확인합니다.
print(type(items), len(items), i, items)
value = items[i]
인덱스는 0부터 시작하므로 길이가 3인 리스트의 유효한 위치는 0, 1, 2입니다. 빈 리스트라면 어떤 인덱스도 읽을 수 없습니다.
빈 리스트를 정상 결과로 착각한 경우
items = get_items()
if not items:
print("처리할 항목이 없습니다.")
else:
process(items[0])
빈 결과가 정상인지, 반드시 데이터가 있어야 하는 오류인지 먼저 정합니다. 정상이라면 안내 후 종료하고, 필수 데이터라면 원인을 남길 수 있도록 검증 오류로 처리합니다.
range 경계를 넘긴 경우
range()의 끝점은 포함되지 않습니다. 리스트를 인덱스로 순회할 때는 range(len(items))을 사용하며 range(len(items) + 1)은 마지막에 없는 인덱스를 만듭니다.
for i in range(len(items)):
process(items[i])
값만 필요하면 직접 순회하고, 위치도 필요하면 enumerate()를 사용합니다.
for item in items:
process(item)
for i, item in enumerate(items):
log_position(i, item)
while문에서는 i <= len(items)가 아니라 i < len(items)이어야 합니다.
split() 결과가 짧은 경우
parts = line.split(",")
if len(parts) < 2:
raise ValueError("쉼표로 구분된 두 필드가 필요합니다.")
name, value = parts[0], parts[1]
구분자가 빠진 행이나 빈 입력에서는 결과 리스트 길이가 달라질 수 있습니다. 해당 행을 버릴지, 보정할지, 입력 오류로 중단할지 업무 규칙을 정한 뒤 접근합니다. 길이와 필드 값의 공백 여부는 별도로 확인해야 합니다.
비어 있는 리스트에서 pop()한 경우
while items:
item = items.pop()
process(item)
pop()은 기본적으로 마지막 항목을 꺼내므로, 꺼낼 대상이 남았는지 확인합니다. 특정 위치를 꺼낼 때도 그 위치가 현재 범위에 있는지 먼저 검증합니다.
try/except IndexError의 기준
예외 처리는 대체 경로가 있고 누락 사실을 기록할 때 의미가 있습니다.
try:
value = items[index]
except IndexError:
log_missing_item(index)
return
반복 범위를 잘못 계산했거나 입력 형식이 보장되어야 하는데 누락된 경우라면 예외를 숨기지 말고 경계나 입력 검증을 고칩니다. 슬라이싱은 범위를 넘어도 가능한 범위만 반환하므로, 단일 값 접근과 같은 의미인지 확인해야 합니다.
원인별 수정 선택표
| 증상 | 먼저 확인할 것 | 수정 방향 |
|---|---|---|
items[0] 실패 |
결과가 빈 리스트인지 | 빈 결과 분기 또는 입력 오류 처리 |
| 마지막 반복 실패 | range와 while 조건 |
직접 순회 또는 올바른 경계 사용 |
split()[1] 실패 |
구분자와 결과 길이 | 길이·필드 형식 검증 |
pop() 실패 |
꺼내기 전 리스트 상태 | if items 또는 while items |
저라면 수정 전에 입력의 길이, 인덱스, 원문 일부를 확인합니다. 코드가 만든 인덱스가 틀린 것인지 입력이 예상 계약을 지키지 않은 것인지 구분해야 조건문, 반복 방식, 입력 검증 중 맞는 수정을 선택할 수 있습니다.
마무리
실제 시퀀스 길이와 인덱스를 확인하고, 빈 입력·반복 경계·split() 결과·pop() 대상 중 어느 조건이 깨졌는지 구분합니다. 값만 순회할 수 있다면 for나 enumerate()로 인덱스 관리를 줄이고 외부 입력은 사용 전에 형식을 검증합니다. 업무상 누락을 허용할 때만 좁은 범위의 try/except와 로그를 사용합니다.
다음으로는 split 결과를 보정할지 실패시킬지, for와 enumerate() 중 어떤 방식이 적절한지, 빈 API 응답을 정상 상태로 볼지를 업무 규칙에 맞춰 정하면 됩니다.