为何无法对Python的range()对象调用next()方法?
问题:为什么range对象能被for循环遍历却不是迭代器?
我正在熟悉Python生成器,尝试使用range()函数,它返回的range对象我原以为是生成器,因此执行以下代码:
a = range(10) print(next(a))
但却出现报错:
TypeError: 'range' object is not an iterator
既然我可以通过for i in range(10)遍历它,为何提示它不是迭代器?
解答
核心原因是**可迭代对象(Iterable)和迭代器(Iterator)**是两个不同的概念:
- 可迭代对象:只要实现了
__iter__()方法,能返回一个迭代器的对象都属于这类,比如列表、字符串、range对象都在此列。 - 迭代器:除了实现
__iter__(),还必须实现__next__()方法,支持通过next()函数逐个取出元素,而且迭代器是一次性的,元素取完就耗尽了。
range对象是可迭代对象,但不是迭代器。当你用for循环遍历它时,Python会自动调用它的__iter__()方法,生成对应的迭代器,再用这个迭代器逐个获取元素,所以for循环能正常运行。
而直接调用next(a)时,因为range对象本身没有__next__()方法,自然会报错。如果要对range对象使用next(),需要先把它转换成迭代器:
a = iter(range(10)) print(next(a)) # 输出0
额外说明:生成器属于迭代器的一种,但range对象既不是生成器也不是迭代器,它是一种特殊的序列类型,能高效表示整数范围,不需要提前生成所有元素——这点和生成器类似,但本质上是不同的对象类型。
内容的提问来源于stack exchange,提问作者Simon Ernesto Cardenas Zarate
相关产品推荐
相关产品推荐

