파이썬 IndexError: list index out of range 원인별 확인 순서와 안전한 입력 처리법

파이썬 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 응답을 정상 상태로 볼지를 업무 규칙에 맞춰 정하면 됩니다.

출처

Leave a Comment