iu2 wrote: > I thought a function definition creates a closure around all used > vars. > As I understand now only variables that are passed as function > arguments can participate in a closure.
No, it's just that all closures see the value of a variable at the time when the closure is run, not when it's defined. I don't know how to express it more clearly, so here's another example: >>> def f(): ... def g(): return a * a ... def h(): return a + a ... a = 5 ... return g, h ... >>> g, h = f() >>> g(), h() (25, 10) As you can see the local variable is not yet set when g() and h() are defined; but only the value by the time they are invoked matters. Here's a more involved generator version where the value may change between invocations: >>> def f(items): ... def g(): return a * a ... def h(): return a + a ... yield g, h ... for a in items: ... yield a ... >>> ff = f([2,3,4]) >>> g, h = next(ff) >>> g() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in g NameError: free variable 'a' referenced before assignment in enclosing scope >>> next(ff) 2 >>> g(), h() (4, 4) >>> next(ff) 3 >>> g(), h() (9, 6) I think this behaviour is also called "late binding". Peter -- http://mail.python.org/mailman/listinfo/python-list