grocery_stocker wrote:
> Give the following code..
>
>>>> class it:
> ...    def __init__(self):
> ...        self.count = -1
> ...    def next(self):
> ...        self.count +=1
> ...        if self.count < 4:
> ...            return self.count
> ...        else:
> ...            raise StopIteration
> ...
>>>> def some_func():
> ...     return it()

this creates a new instance of "it", with a new count, every time the
function is called.

>>>> iterator = some_func()

this sets iterator to be an instance of "it".

>>>> iterator
> <__main__.it instance at 0xb7f482ac>

this is the single "it" instance that iterator is bound to.

>>>> some_func
> <function some_func at 0xb7f45e64>
>>>> some_func()
> <__main__.it instance at 0xb7f4862c>

this is another instance of "it" created when some_func was called.

> How come when I call some_func().next(), the counter doesn't get
> incremented?
>>>> some_func().next()
> 0

this creates yet another instance of "it" and calls next() on it.

>>>> some_func().next()
> 0

this creates another instance of "it" and calls next() on it.

>>>> some_func().next()
> 0

and another instance....

> But when I call iterator.next(), it does.
>>>> iterator.next()
> 0

this calls next() on the instance of "it" that iterator is bound to.

>>>> iterator.next()
> 1

this call next() again on the same instance of "it".

>>>> iterator.next()
> 2
>>>> iterator.next()
> 3

in summary: iterator is bound to one instance of "it", while some_func()
returns a new instance each time it is called.

BUT

while what you are doing is interesting, it is not the same as Python's
iterators, which use "yield" from a function and don't require storing a
value in a class.  look for "yield" in the python docs.  this comment may
be irrelevant; i am just worried you are confusing the above (which apart
from the mistake about instances is perfectly ok) and python's iterators
(which use next(), yield, etc).

andrew


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to