Ya sabes la respuesta: sí. ;) Sin embargo, consuele, ya que este es un descubrimiento muy común para los pythonistas en ciernes. Cuando define una función o lambda que hace referencia a variables que no se "crean" dentro de esa función, crea un cierre sobre las variables. El efecto es que obtienes el valor de la variable al llamar a la función, no el valor en el momento de la definición. (Esperaba esto último)
Hay algunas formas de solucionar esto. En primer lugar está la unión variables extra:
funcs = []
for x in range(10):
funcs.append(lambda x=x: x)
print [f() for f in funcs]
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
La segunda forma es un poco más formal:
from functools import partial
funcs = []
for x in range(10):
funcs.append(partial(lambda x: x, x))
print [f() for f in funcs]
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
pregunta común, se le preguntó (y respondió a) al menos una vez antes: http://stackoverflow.com/questions/233673/lexical-closures-in-python –
@Vladimir: Yeap, pero el título de ambos es bastante diferente, nunca imaginaría que son más o menos lo mismo. – OscarRyz