Tutorials Logic, IN info@tutorialslogic.com

IndexError in Python list index out of range Fix: Causes and Fixes

Python IndexError

IndexError appears when a sequence index falls outside the valid range for the object you are reading. Lists, tuples, strings, and similar sequences all enforce their own bounds at runtime.

The explanation should show how Python numbers positions from zero, why negative indexes still have limits, and why slices behave differently from single-item access.

This topic becomes clear when you compare direct index access, looping by index, and safer alternatives such as enumerate or a length check before the read.

What IndexError Means

An IndexError occurs in Python when you try to access an element of a sequence (list, tuple, or string) using an index that is outside the valid range. Python sequences are zero-indexed, meaning the first element is at index 0 and the last is at index len(sequence) - 1. Accessing any index beyond this range raises an IndexError.

Index Range

  • Accessing an element from an empty list or sequence
  • Off-by-one error - using len(list) as an index instead of len(list) - 1
  • Using a hardcoded index that exceeds the actual list length
  • Looping past the end of a list with a manual index counter
  • Misunderstanding negative indexing behavior

Valid Indexes

Use a Valid Last Index

Use a Valid Last Index
# Out-of-range index: valid positions are 0, 1, and 2
items = [10, 20, 30]
print(items[3])  # IndexError: list index out of range (valid: 0, 1, 2)

# Valid reads: use the last real index or a negative index
print(items[2])   # 30 - last valid index
print(items[-1])  # 30 - negative index for last element

IndexError Cases

Trying to access any index of an empty list raises an IndexError immediately. Always check if a list is non-empty before accessing its elements.

A classic off-by-one error occurs when using range(len(list)) but accidentally going one step too far, or when manually incrementing an index counter past the last valid position.

Using a hardcoded index assumes the list always has a certain number of elements. If the list is shorter than expected (e.g., from a filtered result or API response), the index will be out of range.

When using a while loop with a manual index, it is easy to forget to stop at the right boundary. Always use while i < len(list) rather than while i

Empty List Read by Index

Empty List Read by Index
results = []
first = results[0]  # IndexError: list index out of range

Check the List Before Reading

Check the List Before Reading
results = []

#  Check before accessing
if results:
    first = results[0]
else:
    first = None

#  Or use a try/except
try:
    first = results[0]
except IndexError:
    first = None

Loop Runs One Step Too Far

Loop Runs One Step Too Far
fruits = ["apple", "banana", "cherry"]
for i in range(len(fruits) + 1):  # +1 causes IndexError on last iteration
    print(fruits[i])

Iterate Directly or Use enumerate

Iterate Directly or Use enumerate
fruits = ["apple", "banana", "cherry"]

#  Best: iterate directly over the list
for fruit in fruits:
    print(fruit)

#  If you need the index, use enumerate()
for i, fruit in enumerate(fruits):
    print(f"{i}: {fruit}")

Hardcoded Top Scores

Hardcoded Top Scores
def get_top_scores(scores):
    return scores[0], scores[1], scores[2]  # IndexError if fewer than 3 scores

scores = [95, 87]
top = get_top_scores(scores)  # IndexError: list index out of range

Slice the Available Scores

Slice the Available Scores
def get_top_scores(scores, n=3):
    #  Use slicing - never raises IndexError
    return scores[:n]

scores = [95, 87]
top = get_top_scores(scores)  # [95, 87] - no error

Negative Index on an Empty List

Negative Index on an Empty List
items = [1, 2, 3]
i = 0
while i <= len(items):  # Should be < not <=
    print(items[i])     # IndexError on last iteration when i == 3
    i += 1

Check Before Using Negative Index

Check Before Using Negative Index
items = [1, 2, 3]
i = 0
while i < len(items):  #  Strict less-than
    print(items[i])
    i += 1

#  Even better: use a for loop
for item in items:
    print(item)

Prevent IndexError

  • Prefer for-in loops - Iterating directly over a list (for item in list) eliminates index-related errors entirely.
  • Use enumerate() for indexed loops - for i, item in enumerate(list) is safer than manual index management.
  • Use slicing instead of hardcoded indices - list[:3] never raises IndexError even if the list has fewer than 3 elements.
  • Check list length before access - Use if list or if len(list) > n before accessing specific indices.
  • Use negative indices carefully - list[-1] is the last element, but list[-len(list)-1] still raises IndexError.
  • Use try/except for dynamic data - When list size is unpredictable (API data, user input), wrap index access in try/except IndexError.
  • Use while i < len(list) - Always use strict less-than in while loops to avoid off-by-one errors.

Debug IndexError

  • Print len(items) and the index before reading items[index].
  • Remember that the last valid index is len(items) - 1.
  • Prefer for item in items when you do not need the index.
  • Check empty lists before reading the first or last item.
IndexError checkpoint

Can You Keep Indexes Inside Range?

5 checks
  • An IndexError occurs in Python when you try to access an element of a sequence (list, tuple, or string) using an index that is outside the valid range.
  • Python sequences are zero-indexed, meaning the first element is at index 0 and the last is at index len(sequence) - 1.
  • Accessing any index beyond this range raises an IndexError.
  • Trying to access any index of an empty list raises an IndexError immediately.
  • Always check if a list is non-empty before accessing its elements.

Questions About IndexError

It means you tried to access an index that does not exist in the list. For a list of 3 elements, valid indices are 0, 1, and 2. Accessing index 3 or higher raises this error.

Use negative indexing: list[-1] returns the last element. But first check the list is not empty: if my_list: last = my_list[-1].

IndexError occurs with sequences (lists, tuples, strings) when an integer index is out of range. KeyError occurs with dictionaries when a key does not exist.

Browse Free Tutorials

Explore 500+ free tutorials across 20+ languages and frameworks.