Tutorials Logic, IN info@tutorialslogic.com

IndexError in Python list index out of range Fix: Causes, Fixes, Examples & Interview Tips

What is IndexError?

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.

Common Causes

  • 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

Quick Fix (TL;DR)

Quick Solution

Quick Solution
# ❌ Problem
items = [10, 20, 30]
print(items[3])  # IndexError: list index out of range (valid: 0, 1, 2)

# ✅ Solution
print(items[2])   # 30 "” last valid index
print(items[-1])  # 30 "” negative index for last element

Common Scenarios & Solutions

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

Problem

Problem
results = []
first = results[0]  # IndexError: list index out of range

Solution

Solution
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

Problem

Problem
fruits = ["apple", "banana", "cherry"]
for i in range(len(fruits) + 1):  # +1 causes IndexError on last iteration
    print(fruits[i])

Solution

Solution
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}")

Problem

Problem
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

Solution

Solution
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

Problem

Problem
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

Solution

Solution
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)

Best Practices

  • 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.

Related Errors

Frequently Asked Questions

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.

Use a for-in loop (for item in list) which automatically handles boundaries. If you need indices, use enumerate(). Avoid manual index management with while loops when possible.

Python does not have a built-in .get() for lists like dicts do. Use try/except IndexError, check the length first, or use slicing. You can also use next(iter(list[n:]), default) as a one-liner.

Ready to Level Up Your Skills?

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