Confused with python lists: are they or are they not iterators?

iterator, list, python

Solution

They are iterable, but they are not iterators. They can be passed to `iter()` to get an iterator for them either implicitly (e.g. via `for`) or explicitly, but they are not iterators in and of themselves.

Problem

I am studying Alex Marteli's Python in a Nutshell and the book suggests that any object that has a `next()` method is (or at least can be used as) an iterator. It also suggests that most iterators are built by implicit or explicit calls to a method called `iter`. After reading this in the book, I felt the urge to try it. I fired up a python 2.7.3 interpreter and did this: ``` >>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> for number in range(0, 10): ... print x.next() ``` However the result was this: ``` Traceback (most recent call last): File "<stdin>", line 2, in <module> AttributeError: 'list' object has no attribute 'next' ``` In confusion, I tried to study the structure of the x object via `dir(x)` and I noticed that it had a `__iter__` function object. So I figured out that it can be used as an iterator, so long as it supports that type of interface. So when I tried again, this time slightly differently, attempting to do this: ``` >>> _temp_iter = next(x) ``` I got this error: ``` Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: list object is not an iterator ``` But how can a list NOT be an iterator, since it appears to support this interface, and can be certainly used as one in the following context: ``` >>> for number in x: ... print x ``` Could someone help me clarify this in my mind?

Original source

Related problems