accumulator generators

Cameron cameronlarue at gmail.com
Fri May 30 17:53:18 EDT 2008


On May 30, 1:04 pm, "Diez B. Roggisch" <de... at nospam.web.de> wrote:
> Cameron schrieb:
>
>
>
> > I was reading this <a href="thishttp://www.paulgraham.com/icad.html">Paul
> > Graham article</a> and he builds an accumuator generator function in
> > the appendix. His looks like this:
>
> > <pre>
> > def foo(n):
> >   s = [n]
> >   def bar(i):
> >     s[0] += i
> >     return s[0]
> >   return bar
> > </pre>
>
> > Why does that work, but not this:
>
> > <pre>
> > def foo(n):
> >   s = n
> >   def bar(i):
> >     s += i
> >     return s
> >   return bar
> > </pre>
>
> Because python's static analysis infers s as being a variable local to
> bar in the second case - so you can't modify it in the outer scope.
>
> In the future, you may declare
>
> def bar(i):
>      nonlocal s
>      ...
>
> Diez

thanks for the response. Just to make sure I understand- Is the reason
it works in the first case because s[0] is undefined at that point (in
bar), and so python looks in the outer scope and finds it there?

Cameron




More information about the Python-list mailing list