count strangeness

Chris Rebert crebert at ucsd.edu
Sun May 22 02:27:31 EDT 2011


On Sat, May 21, 2011 at 11:02 PM, James Stroud <jstroud at mbi.ucla.edu> wrote:
> tal 65% python2.7
> Python 2.7.1 (r271:86832, May 21 2011, 22:52:14)
> [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
> Type "help", "copyright", "credits" or "license" for more information.
> py> class C(object):
> ...   def __init__(self):
> ...     self.data = []
> ...   def doit(self, count=0):
> ...     for c in self.data:
> ...       count += c.doit(count)
> ...     count += 1
> ...     print count
> ...     return count
> ...
> py> c = C()
> py> c.data.extend([C() for i in xrange(10)])
> py> c.doit()
> 1
> 2
> 4
> 8
> 16
> 32
> 64
> 128
> 256
> 512
> 1024
> 1024
>
> WTF?

Assuming your question is "Why is 1024 there twice?", the answer is
that it was the return value of the initial c.doit() call, and the
interactive interpreter outputs all non-None expression results; for
example:
[In the Python REPL]
>>> 5 + 5
10
>>>

So, you explicitly print the 1024 in your function once, and the
interpreter implicitly outputs it the second time. Notice what happens
when we use a statement instead of an expression:
>>> final = c.doit()
1
2
4
8
16
32
64
128
256
512
1024
>>> final
1024
>>>

And if we comment out the `print` in C.doit() and run your example again:
>>> c = C()
>>> c.data = [C() for i in xrange(10)]
>>> c.doit()
1024
>>>

Cheers,
Chris
--
http://rebertia.com



More information about the Python-list mailing list