HOWTO · Python

IndexError:파이썬에서 범위를 벗어난 튜플 인덱스

Python에서 범위를 벗어난 튜플 인덱스를 해결하는 방법을 보여줍니다.

이 페이지의 내용

튜플 인덱스 오류는 Python이 튜플에 없는 위치의 항목을 가져오려 할 때 발생합니다. 이 가이드에서는 인덱스가 작동하는 방식, 마지막 항목을 선택하는 방법, 데이터에 따라 달라지는 인덱스를 처리하는 방법을 설명합니다.

IndexError: tuple index out of range의 의미

튜플은 순서가 있고 변경할 수 없는 컬렉션입니다. Python은 항목의 인덱스를 0부터 매기므로, 항목이 n개인 튜플에서 유효한 양수 인덱스는 0부터 n - 1까지입니다. 예를 들어 항목이 7개인 튜플의 마지막 항목은 인덱스 7이 아니라 6에 있습니다. 인덱스 7을 읽으려 하면 IndexError: tuple index out of range가 발생합니다.

음수 인덱스는 끝에서부터 거꾸로 셉니다. -1은 마지막 항목을, -2는 그 앞 항목을 선택합니다. 빈 튜플에는 항목이 없으므로 양수나 음수 인덱스로 항목을 선택할 수 없습니다.

오류의 흔한 원인

가장 흔한 원인은 오프바이원 계산이며, 튜플의 길이를 인덱스로 사용하는 경우가 대표적입니다. items에 요소가 네 개라면 len(items)는 4이지만 마지막 양수 인덱스는 3입니다. range(len(items))를 사용하는 반복문은 마지막 값이 길이보다 하나 작으므로 일반적인 인덱싱에 안전합니다. 여기에 수동으로 1을 더하면 범위를 벗어날 수 있습니다.

인덱스는 입력값이나 계산 결과에서 가져오거나, 단계가 진행되는 동안 바뀌는 데이터에 따라 정해질 수도 있습니다. 오류가 발생한 접근에 실제로 사용된 값과 당시 튜플의 길이를 확인하세요. 값의 유형이 다르다는 사실만으로 이 튜플 관련 오류 메시지를 설명할 수는 없습니다. 트레이스백이나 변수 이름이 혼란을 준다면 실제로 어떤 객체를 인덱싱하는지 확인하세요.

튜플의 마지막 항목에 안전하게 접근하기

항목이 하나 이상 있는 튜플에서는 items[-1]을 사용하면 마지막 항목을 간결하게 가져올 수 있습니다. 다른 로직에서 길이가 이미 필요하다면 items[len(items) - 1]로도 같은 위치를 선택할 수 있습니다. 두 방법 모두 튜플에 항목이 하나 이상 있어야 합니다.

다음 예제를 실행해 보세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

items = ("red", "green", "blue")
print(items[-1])

예제의 출력은 blue입니다. 출력 문자열은 영어로 표시됩니다.

blue

튜플이 비어 있을 수 있다면 인덱싱하기 전에 확인하세요.

items = ()
if items:
    print(items[-1])
else:
    print("No items")

항목이 없는 경우에는 No items가 출력됩니다. 이 출력 문자열은 영어로 표시됩니다.

No items

이렇게 하면 항목이 없는 경우를 명시적으로 처리하므로, 실패할 수밖에 없는 접근을 시도하지 않습니다.

범위를 벗어날 수 있는 인덱스 처리하기

인덱스가 튜플의 유효 범위 안에 있을 것으로 예상되더라도 접근 전에 검사하세요. 이렇게 하면 기본값을 선택하거나 요청한 위치를 사용할 수 없다고 알리기도 쉽습니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

items = ("red", "green", "blue")
index = 4
if 0 <= index < len(items):
    print(items[index])
else:
    print("Index is outside the tuple")

이 예제는 Index is outside the tuple을 출력합니다. 출력 문자열은 영어로 표시됩니다.

Index is outside the tuple

범위 검사는 사용할 수 없는 위치에 대해 프로그램이 특정 방식으로 응답해야 할 때 유용합니다. 인덱스가 정상적으로 달라질 수 있는 작업에서 접근 실패를 미리 검사하기보다 예외로 처리하는 편이 명확하다면 IndexError를 잡아 처리하세요. try 블록에는 해당 접근만 포함하세요. 예외를 광범위하게 처리하면 관련 없는 프로그래밍 오류가 감춰질 수 있습니다. 빈 튜플에는 양수 인덱스 검사를 통과하는 인덱스가 없습니다.

인덱싱 전에 값과 인덱스 확인하기

객체의 유형이 확실하지 않다면 먼저 isinstance(value, tuple)로 튜플인지 확인하세요. 이 검사는 객체의 유형을 확인할 뿐, 특정 인덱스에 항목이 있다는 뜻은 아닙니다. 그런 다음 len(value)를 기준으로 인덱스를 검사하거나, 접근할 때 IndexError를 처리하세요. 객체가 다른 시퀀스 유형이라면 해당 유형에서 예상되는 동작을 확인하세요. 튜플 관련 오류 메시지가 그 객체 때문에 발생했다고 단정해서는 안 됩니다.

요약하면 IndexError는 튜플에 실제로 있는 위치를 벗어나 접근하려 했음을 나타냅니다. 오프바이원 계산을 바로잡고, 비어 있지 않은 튜플의 마지막 항목에는 items[-1]을 사용하세요. 인덱스가 데이터에 따라 달라진다면 명시적으로 범위를 검사하거나 해당 접근에 한정해 예외를 처리하세요.