Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python IndexError: tuple index out of range 오류 원인과 해결 방법

파이썬의 튜플(tuple)은 리스트와 마찬가지로 인덱스를 가집니다. 즉, 튜플 안의 각 값에는 해당 값에 접근할 수 있는 고유한 번호가 부여됩니다. 그런데 존재하지 않는 항목에 접근하려고 하면 파이썬은 "tuple index out of range"라는 오류 메시지를 반환합니다.

이 글에서는 이 흔한 파이썬 오류가 무엇을 의미하는지, 왜 발생하는지 설명하고, 실제 예제를 통해 해결 방법까지 단계별로 살펴보겠습니다.

오류 분석: IndexError: tuple index out of range

튜플은 0부터 인덱싱이 시작됩니다. 이후의 모든 값은 바로 앞 값보다 1 큰 번호를 할당받습니다. 다음 튜플을 살펴보겠습니다.

birds = ("Robin", "Collared Dove", "Great Tit", "Goldfinch", "Chaffinch")

이 튜플에는 다섯 개의 값이 들어 있으며, 각 값마다 고유한 인덱스 번호가 있습니다.

RobinCollared DoveGreat TitGoldfinchChaffinch
01234

튜플에서 "Robin"이라는 값에 접근하려면 다음과 같은 코드를 사용합니다.

print(birds[0])

이 코드는 Robin을 출력합니다. 인덱스 위치 0에 있는 값을 가져와 콘솔에 출력한 것입니다. 같은 방식으로 튜플의 어떤 값이든 접근할 수 있습니다.

반면, 튜플 범위를 벗어난 항목에 접근하려고 하면 오류가 발생합니다.

예제 시나리오

튜플의 마지막 세 값을 출력하는 프로그램을 작성해 보겠습니다. 이번에는 영국 도시 목록이 담긴 튜플을 사용합니다. 먼저 튜플을 선언합니다.

cities = ("Edinburgh", "London", "Southend", "Bristol", "Cambridge")

다음으로 마지막 세 값을 출력해야 합니다. 이를 위해 for 루프와 range() 함수를 사용하겠습니다. range() 함수는 특정 범위 사이의 숫자 목록을 생성해 주므로, 해당 범위의 인덱스 번호를 가진 항목들을 반복해서 순회할 수 있습니다.

for 루프 코드는 다음과 같습니다.

for i in range(3, 6):
	print(cities[i])

코드를 실행해 보겠습니다.

Bristol
Cambridge
Traceback (most recent call last):
  File "main.py", line 4, in <module>
	print(cities[i])
IndexError: tuple index out of range

코드는 Bristol과 Cambridge 두 값을 출력했습니다. 이것은 리스트의 마지막 두 값입니다. 그런데 세 번째 값은 출력되지 않고 오류가 발생했습니다.

해결 방법

원인을 파악해 보겠습니다. range(3, 6) 구문은 3부터 6 사이의 숫자 목록을 생성합니다. 이때 3은 포함되지만 6은 제외되므로, 실제로 생성되는 숫자는 3, 4, 5입니다. 그런데 우리 튜플의 인덱스는 0부터 4까지만 존재합니다. 따라서 루프는 인덱스 5에 있는 도시에 접근하려다 실패하는 것입니다. 5가 range 범위에 포함되어 있기 때문입니다.

직접 확인해 보기 위해 cities[5]를 단독으로 출력해 보겠습니다.

print(cities[5])

결과는 다음과 같습니다.

Traceback (most recent call last):
  File "main.py", line 3, in <module>
	print(cities[5])
IndexError: tuple index out of range

동일한 오류가 발생합니다. 원인은 항목들이 1부터 인덱싱된다고 착각했기 때문입니다. 튜플은 0부터 인덱싱됩니다.

이 오류를 해결하려면 range() 구문을 수정하여 튜플의 마지막 세 항목만 출력하도록 해야 합니다. 범위는 2부터 5까지로 지정하면 됩니다.

for i in range(2, 5):
	print(cities[i])

수정된 코드를 실행해 보겠습니다.

Southend
Bristol
Cambridge

이제 코드가 정상적으로 튜플의 마지막 세 항목을 출력합니다. 인덱스 위치 2, 3, 4에 있는 항목에 접근하고 있으며, 세 위치 모두 유효하기 때문에 코드가 문제없이 동작합니다.

마무리

IndexError: tuple index out of range 오류는 튜플에 존재하지 않는 항목에 접근하려고 할 때 발생합니다. 이 문제를 해결하려면 튜플에서 항목에 접근할 때마다 해당 항목이 실제로 존재하는지 반드시 확인해야 합니다.

이 오류의 가장 흔한 원인은 튜플이 0부터 인덱싱된다는 사실을 잊는 것입니다. 튜플에서 값을 가져올 때는 항상 0부터 세어야 합니다. 초보자에게는 다소 어색하게 느껴질 수 있지만, 파이썬 코딩 경험이 쌓이면 0부터 세는 것이 자연스러워질 것입니다.

참고로, 음수 인덱스를 활용하면 더 간단하게 마지막 요소들에 접근할 수도 있습니다. 예를 들어 cities[-1]은 마지막 요소인 Cambridge를 반환하고, cities[-3:]은 마지막 세 요소를 슬라이싱하여 반환합니다. 이러한 기법도 함께 활용하면 인덱스 범위 오류를 줄이는 데 도움이 됩니다.

이제 여러분도 전문가처럼 이 파이썬 오류를 해결할 준비가 되었습니다!