IndexError: tuple index out of range (Fix)
IndexError: tuple index out of range means your code is trying to read a tuple position that does not exist.
This usually happens when you use an index that is too large, or when you forget that Python indexes start at 0.
Quick fix
colors = ("red", "green", "blue")
# Wrong: colors[3] # IndexError
# Correct: use a valid index
print(colors[2])
# Or check length first
index = 3
if index < len(colors):
print(colors[index])
else:
print("Index out of range")
Tuple indexes start at 0. A tuple with 3 items has valid indexes 0, 1, and 2.
What this error means
Python raises this error when you try to access a tuple index that is outside the tuple's valid range.
Important points:
- Tuple indexing starts at
0, not1 - A tuple with 3 items has indexes
0,1, and2 - Negative indexes work from the end, but they must still be valid
If you are new to tuples, see Python tuples explained.
Example that causes the error
Here is a small tuple with 3 items:
colors = ("red", "green", "blue")
print(colors[3])
Output:
IndexError: tuple index out of range
Why this fails:
- The tuple has 3 items
- The valid indexes are
0,1, and2 colors[3]asks for a fourth item, but there is no fourth item
The last valid index is 2.
If you want a clearer explanation of positions in tuples, see Python tuple indexing explained.
Why it happens
This error usually happens for one of these reasons:
- Using an index that is too large
- Using a negative index that goes past the start of the tuple
- Assuming the tuple has more items than it really has
- Using loop logic that goes one step too far
For example, this fails because the negative index is too small for the tuple:
numbers = (10, 20, 30)
print(numbers[-4])
A 3-item tuple supports these negative indexes:
-1for the last item-2for the second-to-last item-3for the first item
But -4 is outside the valid range.
How to fix it
Use the correct index
If you know the tuple size, use a valid index.
colors = ("red", "green", "blue")
print(colors[0]) # red
print(colors[2]) # blue
Check the tuple length with len()
If the index may change, check it before accessing the tuple.
colors = ("red", "green", "blue")
index = 3
if 0 <= index < len(colors):
print(colors[index])
else:
print("Index out of range")
This is safer when the tuple size is not guaranteed.
If needed, read more about Python tuple length with len().
Loop over the tuple directly
If you want every item, you often do not need indexes at all.
colors = ("red", "green", "blue")
for color in colors:
print(color)
This avoids index mistakes completely.
Use enumerate() when you need both index and value
If you need the position and the item, enumerate() is safer than manual indexing.
colors = ("red", "green", "blue")
for i, color in enumerate(colors):
print(i, color)
Output:
0 red
1 green
2 blue
See also Python enumerate() function explained.
Debugging steps
When you see this error, check these things first:
- Print the tuple to see what it really contains
- Print its length
- Print the index value before the failing line
- Confirm that your code is using 0-based indexing
Useful debugging commands:
print(my_tuple)
print(len(my_tuple))
print(index)
for i, value in enumerate(my_tuple):
print(i, value)
Example:
user = ("Alice", 25)
index = 2
print(user)
print(len(user))
print(index)
print(user[index])
Output before the error:
('Alice', 25)
2
2
This tells you:
- The tuple has only 2 items
- Valid indexes are
0and1 - Index
2is not valid
Special case: negative indexes
Negative indexes count from the end of the tuple:
my_tuple[-1]means the last itemmy_tuple[-2]means the second-to-last item
Example:
letters = ("a", "b", "c")
print(letters[-1]) # c
print(letters[-2]) # b
But negative indexes can still fail if the tuple is shorter than expected:
letters = ("a", "b", "c")
print(letters[-4])
This raises:
IndexError: tuple index out of range
How to avoid this error in the future
- Do not guess tuple positions
- Check the structure of returned data before indexing
- Prefer unpacking when you know the tuple size
- Use loops for all items instead of hard-coded indexes
For example, unpacking is often clearer than manual indexing:
point = (10, 20)
x, y = point
print(x)
print(y)
This is easier to read than:
point = (10, 20)
print(point[0])
print(point[1])
Common mistakes
These are very common causes of this error:
- Accessing index
3in a tuple that only has 3 items - Using 1-based thinking instead of Python's 0-based indexing
- Looping with
range(len(my_tuple) + 1) - Using a negative index smaller than the tuple allows
- Reading function return values and assuming the tuple shape incorrectly
Here is a common loop mistake:
values = (10, 20, 30)
for i in range(len(values) + 1):
print(values[i])
Why it fails:
len(values)is3range(len(values) + 1)gives0, 1, 2, 3- Index
3does not exist
Correct version:
values = (10, 20, 30)
for i in range(len(values)):
print(values[i])
Or even better:
values = (10, 20, 30)
for value in values:
print(value)
If you are seeing the same problem with a list, read IndexError: list index out of range.
FAQ
Are tuples 0-indexed in Python?
Yes. The first item is at index 0.
Can negative indexes cause this error?
Yes. If the negative index goes beyond the start of the tuple, Python raises the same error.
How is this different from list index out of range?
The cause is basically the same, but this error happens with tuples instead of lists.
Should I use len() before every tuple access?
Not always. Use it when the tuple size may change or when the index is not guaranteed to be valid.