iter

Steven D'Aprano steve-REMOVE-THIS at cybersource.com.au
Tue Aug 10 06:12:10 CEST 2010


On Mon, 09 Aug 2010 09:11:37 -0700, daryn wrote:

> I'm just playing around with the iter function and I realize that I can
> use the iterator returned by it long after the original object has any
> name bound to it.

Yes, the same as everything else in Python. Iterators aren't unique here.

>>> a = [1,2,3]
>>> b = [None, a, None]
>>> id(a) == id(b[1])  # Same object, not a copy?
True
>>> del a
>>> print b
[None, [1, 2, 3], None]



> it seems as if the original object is never being garbage collected even
> though there is no name bound to it.

Of course not. That would be a Bad Thing if Python garbage collected an 
object while other objects were still using it. Can you say "core dump"?



> Does the name bound to the
> iterator object count as a reference to the original object for garbage
> collection purposes?

No, but the iterator itself does.

The technique is called *reference* counting, not "name counting". Each 
name is a reference, but not every reference is a name.


> Is there some way to retrieve/manipulate the
> original object via the iterator?

Depends on the iterator. For the standard iterator created by iter(), I 
don't think so. But for a custom iterator type, there can be if you want:

class MyIter(object):
    """Quick and dirty iterator."""
    def __init__(self, data):
        self.data = data
        self.i = 0
    def __iter__(self):
        return self
    def next(self):
        try:
            o = self.data[self.i]
        except IndexError:
            raise StopIteration
        self.i += 1
        return o


>>> it = MyIter([1,2,3,4])
>>> it.next()
1
>>> del it.data[1:3]
>>> it.next()
4




-- 
Steven



More information about the Python-list mailing list