Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.python > #12350
| Newsgroups | comp.lang.python |
|---|---|
| Date | 2011-08-28 14:16 -0700 |
| References | <mailman.500.1314503122.27778.python-list@python.org> |
| Subject | Re: Why do closures do this? |
| From | Carl Banks <pavlovevidence@gmail.com> |
| Message-ID | <mailman.515.1314566198.27778.python-list@python.org> (permalink) |
On Saturday, August 27, 2011 8:45:05 PM UTC-7, John O'Hagan wrote:
> Somewhat apropos of the recent "function principle" thread, I was recently surprised by this:
>
> funcs=[]
> for n in range(3):
> def f():
> return n
> funcs.append(f)
>
> [i() for i in funcs]
>
> The last expression, IMO surprisingly, is [2,2,2], not [0,1,2]. Google tells me I'm not the only one surprised, but explains that it's because "n" in the function "f" refers to whatever "n" is currently bound to, not what it was bound to at definition time (if I've got that right), and that there are at least two ways around it: ....
> My question is, is this an inescapable consequence of using closures, or is it by design, and if so, what are some examples of where this would be the preferred behaviour?
It is the preferred behavior for the following case.
def foo():
def printlocals():
print a,b,c,d
a = 1; b = 4; c = 5; d = 0.1
printlocals()
a = 2
printlocals()
When seeing a nested function, there are strong expectations by most people that it will behave this way (not to mention it's a lot more useful). It's only for the less common and much more advanced case of creating a closure in a loop that the other behavior would be preferred.
Carl Banks
Back to comp.lang.python | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Why do closures do this? John O'Hagan <research@johnohagan.com> - 2011-08-28 13:45 +1000 Re: Why do closures do this? Carl Banks <pavlovevidence@gmail.com> - 2011-08-28 14:16 -0700 Re: Why do closures do this? Carl Banks <pavlovevidence@gmail.com> - 2011-08-28 14:16 -0700
csiph-web