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 -- http://mail.python.org/mailman/listinfo/python-list