Greg Ewing wrote:
1. If the loop variable is referenced by such a nested function, a new local scope is effectively created to hold each successive value of the loop variable.
Why only the loop variable? What about: >>> for i in range(3): ... j= str(i) ... funs.append(lambda: j) >>> funs[0]() '2' It seems an odd sort of scope that lets rebindings inside it fall through outwards.
Also, most other languages which have lexical scoping and first-class functions don't seem to suffer from problems like this.
That's not always because of anything to do with introducing scopes though. Some of those languages can bind the variable value early, so if you were to write the equivalent of: >>> i= 3 >>> f= lambda: i >>> i= 4 f() would give you 3. I would love to see an early-value-binding language with similar syntax to Python, but I can't see how to get there from here. There are other languages with lexical scope and late value binding, such as JavaScript; their for loops behave the same as Python.
0. There is no change if the loop variable is not referenced by a nested function defined in the loop body.
You mean: >>> i= 0 >>> geti= lambda: i >>> for i in [1]: ... print i is geti() True >>> for i in [1]: ... dummy= lambda: i ... print i is geti() False This seems unconscionably spooky to me. Explicit is better than yadda yadda. How about explicitly requesting to be given a new scope each time around the loop? This would clear up the compatibility problems. >>> for local i in range(3): ... funs.append(lambda: i) ... q= 3 >>> funs[0]() 0 >>> q NameError Or similar syntax as preferred. -- And Clover mailto:and@doxdesk.com http://www.doxdesk.com/