Last modified: Apr 09, 2025 By Alexander Williams

Fix TypeError: slice indices must be integers

Python developers often encounter the TypeError: slice indices must be integers or None or have an __index__ method. This error occurs when using invalid slice indices.

What Causes This Error?

The error happens when you try to slice a sequence (like a list or string) using non-integer values. Python only accepts integers or None for slicing.

Common causes include using floats, strings, or other objects as slice indices. The __index__ method allows custom objects to work as indices.

Basic Example of the Error

Here's a simple example that triggers this error:


my_list = [1, 2, 3, 4, 5]
print(my_list[1.5:3])  # Using float as slice index


TypeError: slice indices must be integers or None or have an __index__ method

How To Fix The Error

Here are three ways to resolve this TypeError in Python:

1. Use Integer Indices

Convert your slice indices to integers using int() or round them:


my_list = [1, 2, 3, 4, 5]
start_index = int(1.5)  # Convert to integer
print(my_list[start_index:3])  # Works now

2. Handle None Values Properly

None is valid for slice indices. It represents the start or end of the sequence:


my_string = "hello"
print(my_string[None:3])  # Same as [:3]

3. Implement __index__ for Custom Objects

If using custom objects, implement the __index__ method:


class MyIndex:
    def __index__(self):
        return 2

my_list = [10, 20, 30, 40]
idx = MyIndex()
print(my_list[idx:])  # Works because of __index__

Common Scenarios and Solutions

Here are some frequent cases where this error occurs:

Case 1: Using Float Values

Floats can't be slice indices. Convert them to integers first:


# Wrong
data = "abcdef"
print(data[1.5:4])

# Right
print(data[int(1.5):4])

Case 2: String Indices

String indices won't work. Convert to integers if they represent numbers:


# Wrong
nums = [1, 2, 3]
print(nums["1":"3"])

# Right
print(nums[int("1"):int("3")])

Case 3: Incorrect Variable Types

Variables used in slicing must evaluate to integers. Check their types:


start = "2"  # Oops, it's a string
end = 4
numbers = [0, 1, 2, 3, 4, 5]

# Fix by converting
print(numbers[int(start):end])

Preventing the Error

Follow these best practices to avoid this TypeError:

1. Always validate indices before slicing

2. Use type hints to catch issues early

3. Wrap slicing operations in try-except blocks

For similar Python errors, see our guide on How To Solve ModuleNotFoundError.

Conclusion

The TypeError: slice indices must be integers is easy to fix once you understand it. Always use integers or None for slicing. Convert other types when needed.

Remember that sequences in Python (lists, strings, tuples) only accept proper slice indices. Implement __index__ for custom objects that should work as indices.

With these solutions, you can handle this error confidently in your Python projects.