Original article: List Index Out of Range – Python Error Message Solved

이 기사에서는 Python에서 리스트 인덱스가 범위를 벗어났다는 의미의 Indexerror: list index out of range 오류가 발생하는 몇 가지 이유에 대해 살펴보겠습니다.

오류가 발생하는 이유에 대해 알아본 후 이 오류를 방지하는 몇 가지 방법도 배워보겠습니다.

그럼 시작해볼까요?

Python 리스트 생성하기

Python에서 리스트 객체를 생성하려면 다음을 실행해야 합니다.

  • 리스트 객체의 이름을 지정하고,
  • 할당 연산자인 =를 사용하고,
  • 대괄호 [] 안에 0개 이상의 리스트 항목을 포함합니다. 각 리스트 항목은 쉼표로 구분해야 합니다.

예를 들어, 이름 목록을 작성하려면 다음과 같은 코드를 실행합니다.

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

위의 코드는 Kelly, Nelly, Jimmy, Lenny의 네 가지 값을 가진 names라는 리스트를 생성합니다.

Python 리스트 길이 확인하기

리스트의 길이를 확인하려면 Python의 내장 함수 len()를 사용하면 됩니다.

len()은 리스트에 저장된 항목의 수인 정수를 반환합니다.

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

#name_length라는 변수를 만들어 리스트의 길이를 저장합니다
name_length = len(names)

#변수의 값을 콘솔에 출력합니다. 
print(name_length)

#출력된 값 
#4

리스트에 저장된 항목이 4개이므로 리스트의 길이 또한 4입니다.

Python 리스트의 개별 항목에 접근하는 방법

리스트의 각 항목은 고유한 인덱스 번호(index number)가 있습니다.

Python 및 대부분의 현대 프로그래밍 언어에서는 인덱싱이 0부터 시작합니다.

즉, 리스트의 첫 번째 항목은 0, 두 번째 항목은 1의 인덱스를 갖습니다.

인덱스를 활용해 개별 항목에 접근할 수 있습니다.

그러려면 먼저 리스트 이름을 작성합니다. 그런 다음 대괄호 안에 항목의 인덱스에 해당하는 정수를 포함합니다.

이전 예시의 경우 인덱스를 사용해 리스트 내의 각 항목에 접근하는 방법은 다음과 같습니다.

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

names[0] # Kelly
names[1] # Nelly
names[2] # Jimmy
names[3] # Lenny

음수 인덱스(negative index)를 사용해 Python 리스트 내 항목에 접근할 수도 있습니다.

마지막 항목에 접근하려면 인덱스 값 -1을 사용하면 됩니다. 마지막에서 두 번째 항목에 접근하려면 인덱스 값 -2를 사용합니다.

다음 코드 블록은 음수 인덱스를 사용해 리스트 내의 각 항목에 접근하는 방법입니다.

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

names[-4] # Kelly
names[-3]# Nelly
names[-2] # Jimmy
names[-1] # Lenny

Indexerror: list index out of range error 오류가 발생하는 이유

첫 번째 원인: 리스트 범위를 벗어나는 인덱스 사용

리스트의 인덱스 범위를 벗어난, 존재하지 않는 값을 사용해 항목에 접근하려고 하면 Index error: list index out of range 오류가 발생합니다.

이 오류는 리스트의 마지막 항목에 접근하거나 음수 인덱스를 사용해 첫 번째 항목에 접근할 때 흔히 발생합니다.

예시를 다시 살펴봅시다.

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

리스트의 마지막 항목인 Lenny에 접근하려고 다음과 같은 코드를 실행했다고 가정해봅시다.

print(names[4])

#출력된 값 

#Traceback (most recent call last):
#  File "/Users/boyeonihn/python_articles/demo.py", line 3, in <module>
#    print(names[4])
#IndexError: list index out of range

일반적으로 리스트의 인덱스 범위는 0에서 n-1이며, 여기서 n은 리스트의 총 항목 수입니다.

예시의 names 리스트는 총 항목 수가 4이고 인덱스 범위는 0에서 3입니다.

이제 음수 인덱스로 리스트 항목을 접근해봅시다.

음수 인덱스를 사용해 첫 번째 항목인 Kelly에 접근한다고 가정해볼까요?

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

print(names[-5])

#출력된 값 

#Traceback (most recent call last):
#  File "/Users/boyeonihn/python_articles/demo.py", line 3, in <module>
#    print(names[-5])
#IndexError: list index out of range

음수 인덱스를 사용할 경우 리스트의 인덱스 범위는 -1에서 -n입니다. 여기서 -n은 리스트에 포함된 총 항목 수입니다.

리스트의 총 항목 수가 4라면, 인덱스 범위는 -1에서-4입니다.

두 번째 원인: for문에서 range() 함수에 잘못된 값 전달

리스트를 순회할 때 존재하지 않는 항목에 접근하려고 하면 Indexerror: list index out of range 오류가 발생합니다.

이런 오류가 발생하는 흔한 경우 중 하나는 Python의 range() 함수에서 잘못된 정수를 사용했을 때입니다.

range() 함수에는 일반적으로 카운트가 종료하는 위치(종료값이라고도 불립니다 --옮긴이)를 나타내는 정수 하나가 전달됩니다.

예를 들어 range(5)는 카운트가 0에서 시작해 4에서 종료됨을 나타냅니다.

다시 말해 카운트는 기본적으로 0에서 시작되고 전달된 종료값에서 1을 뺀 값까지 매번 1씩 증가합니다. range() 함수에 인자로 전달된 종료값은 카운트에 포함되지 않는다는 점을 꼭 명심하세요.

예시를 확인해봅시다.

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

for name in range(5):
    print(names[name])
    
#출력된 값 

#Kelly
#Nelly
#Jimmy
#Lenny
#Traceback (most recent call last):
#  File "/Users/boyeonihn/python_articles/demo.py", line 7, in <module>
#   print(names[name])
#IndexError: list index out of range

names 리스트에는 네 가지 값이 있습니다.

이 리스트를 순회하고 각 항목의 값을 출력하고 싶다는 가정해보겠습니다.

range(5)를 사용할 때 Python 인터프리터에게 0에서 4까지에 위치한 값을 출력하라는 지시를 전하는 의미입니다.

그러나 4 위치에는 항목이 없습니다.

위치 번호를 출력한 후 해당 위치의 값을 출력해보면 이 사실을 확인할 수 있습니다.

#0
#Kelly
#1
#Nelly
#2
#Jimmy
#3
#Lenny
#4
#Traceback (most recent call last):
#  File "/Users/dionysialemonaki/python_articles/demo.py", line 8, in <module>
#    print(names[name])
#IndexError: list index out of range

range(5)0에서 4까지의 위치를 나타냅니다. 0 위치에는 "Kelly", 1 위치에는 "Nelly", 2 위치에는 "Jimmy", 그리고 3 위치에는 "Lenny"라는 값이 있다는 것을 확인할 수 있습니다.

4 위치의 경우 출력할 값이 없으므로 인터프리터가 오류를 발생시킵니다.

이 오류를 해결하는 한 가지 방법은 range()에 전달된 정수를 낮추는 것입니다.

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

for name in range(4):
    print(name)
    print(names[name])
    
#출력된 값

#0
#Kelly
#1
#Nelly
#2
#Jimmy
#3
#Lenny

for문을 사용할 때 이 오류를 해결하는 또 다른 방법은 리스트의 길이를 range() 함수에 인수로 전달하는 것입니다. 이전 섹션에서 설명한 것처럼 내장 함수 len()를 사용하면 됩니다.

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

for name in range(len(names)):
    print(names[name])

#출력된 값

#Kelly
#Nelly
#Jimmy
#Lenny

len()range()에 인수로 전달할 때 다음과 같은 실수를 조심하세요.

names = ["Kelly", "Nelly", "Jimmy", "Lenny"]

for name in range(len(names) + 1):
    print(names[name])

이런 코드를 실행하면 IndexError: list index out of range 오류가 다시 발생합니다.

#Kelly
#Nelly
#Jimmy
#Lenny
#Traceback (most recent call last):
#  File "/Users/boyeonihn/python_articles/demo.py", line 4, in <module>
#    print(names[name])
#IndexError: list index out of range

마치며

이제 IndexError: list index out of range 오류가 발생하는 이유와 이를 방지할 수 있는 몇 가지 방법에 대해 이해가 잘 되셨나요?

Python에 대해 더 배워보고 싶다면 freeCodeCamp의 Python 수료증 과정을 확인해보세요. 수료증 강의를 통해 초보자여도 Python을 재미있고 유익하게 배우면서 5개의 프로젝트를 해보며 배운 것을 열심히 실습할 수 있을 거에요.

읽어주셔서 감사합니다. Happy coding!