Aldo Cortesi <[EMAIL PROTECTED]> writes: > The lexical scope within which a function is declared is > made available to the function when it is run. This is done > by storing the values of free variables within the declared > function in the func_closure attribute of the created > function object.
Actually not quite right: a = [] for i in range(5): a.append(lambda: i) # i is free in the lambda print [f() for f in a] prints [4,4,4,4,4] instead of [0,1,2,3,4]. The value of i has not been copied into the closure. Rather, the closure has a cell bound to the same place that i is bound. So: for i in range(5): def f(): j = i # bind a new variable "j" and assign the value from i return lambda: j # j is free and its value doesn't change a.append(f()) print [f() for f in a] prints [0,1,2,3,4]. There's a Pythonic idiom using default args: a = [] for i in range(5): a.append(lambda i=i: i) # the "inner" i is free in the lambda print [f() for f in a] Closures like may look a little surprising in Python but they're a standard technique in Scheme. The classic textbook "Structure and Interpretation of Computer Programming" explains it all. Full text is online at: http://mitpress.mit.edu/sicp/ -- http://mail.python.org/mailman/listinfo/python-list