Error for x in range: TypeError: 'type' object is not iterable
Categories:
Understanding and Resolving 'TypeError: 'type' object is not iterable' in Python

This article explains the common Python error 'TypeError: 'type' object is not iterable', detailing its causes, providing practical examples, and offering clear solutions for developers.
The TypeError: 'type' object is not iterable
is a common error encountered by Python developers, especially when working with loops or functions that expect iterable objects. This error message indicates that you are attempting to iterate over a data type that Python does not recognize as a collection of items, such as a class itself, rather than an instance of that class or a proper iterable like a list, tuple, or string.
What Does 'Iterable' Mean in Python?
In Python, an 'iterable' is an object that can be looped over, meaning it can return its members one at a time. Examples of built-in iterable types include lists, tuples, strings, dictionaries, and sets. When Python encounters a for
loop or a function like map()
, filter()
, or sum()
that expects an iterable, it tries to call the object's __iter__()
method (or __getitem__()
for sequence types). If the object is a 'type' (i.e., a class definition) rather than an instance or a collection, it lacks these methods, leading to the TypeError
.

Understanding Python Iterables
Common Scenarios and Solutions
This error typically arises from a misunderstanding of how to use classes, functions, or built-in types. Let's explore the most frequent causes and their corresponding solutions.
Scenario 1: Iterating Over a Class Instead of an Instance
One of the most common causes is attempting to iterate directly over a class definition rather than an instantiated object of that class. A class itself is a blueprint, not a collection of items.
class MyClass:
def __init__(self, data):
self.data = data
# Incorrect: Trying to iterate over the class itself
for item in MyClass: # This will raise the TypeError
print(item)
# Correct: Iterate over an instance of the class (if it's iterable)
my_instance = MyClass([1, 2, 3])
# If MyClass is designed to be iterable, you'd implement __iter__ and __next__
# For simplicity, let's assume we want to iterate over its 'data' attribute
for item in my_instance.data:
print(item)
Incorrectly iterating over a class vs. correctly iterating over an instance's attribute.
MyClass()
.Scenario 2: Passing a Type to a Function Expecting an Iterable
Another frequent occurrence is passing a type (like int
, str
, list
) to a function that expects an iterable, such as range()
, map()
, or sum()
. The range()
function, for example, expects integer arguments for its start, stop, and step parameters, not the int
type itself.
# Incorrect: Passing the 'int' type to range()
for x in range(int): # This will raise the TypeError
print(x)
# Correct: Passing an integer value to range()
for x in range(5): # Iterates from 0 to 4
print(x)
# Incorrect: Passing the 'list' type to sum()
my_sum = sum(list) # This will raise the TypeError
# Correct: Passing a list instance to sum()
my_list = [1, 2, 3, 4]
my_sum = sum(my_list)
print(my_sum)
Misusing built-in functions by passing types instead of values or instances.
Scenario 3: Incorrectly Defining or Using Custom Iterators/Generators
If you're implementing custom iterable behavior using __iter__
and __next__
methods, or creating generator functions, you might encounter this error if the __iter__
method doesn't return an iterator object, or if you try to iterate over the generator function itself instead of calling it to get a generator object.
class MyIterable:
def __init__(self, limit):
self.limit = limit
self.current = 0
def __iter__(self):
# Correct: __iter__ should return self (if self is an iterator) or another iterator object
return self
def __next__(self):
if self.current < self.limit:
self.current += 1
return self.current - 1
else:
raise StopIteration
# Correct: Iterate over an instance of MyIterable
for i in MyIterable(3):
print(i)
# Incorrect: Trying to iterate over the class MyIterable directly
# for i in MyIterable: # This would raise TypeError if __iter__ wasn't properly defined to return an iterator
# print(i)
# Example with a generator function
def my_generator(limit):
for i in range(limit):
yield i
# Incorrect: Trying to iterate over the generator function itself
# for x in my_generator: # This will raise TypeError
# print(x)
# Correct: Call the generator function to get a generator object, then iterate
for x in my_generator(3):
print(x)
Correctly using custom iterators and generator functions.
__iter__
method returns an object that has a __next__
method (i.e., an iterator). For generator functions, remember to call the function to get the generator object before iterating.