Es importante entender que cuando una variable se convierte en parte de un cierre que es la propia variable y no el valor está incluido.
Esto significa que todos los cierres creados en el bucle utilizan la misma variable f
, que al final del bucle contendrá el último valor utilizado dentro del bucle.
Debido a cómo el lenguaje se define sin embargo esas variables son capturados "sólo lectura" en Python 2.x: ninguna asignación crea una variable de una local a menos que sea declarado global
(3.x Python añade la palabra clave nonlocal
para permitir la escritura de un local del alcance externo).
Como dijo Jochen Ritzel en su respuesta el lenguaje común para evitar esta variable captura y obtener su lugar de captura de valor es escribir
lambda f=f: os.startfile(f)
esto funciona porque los valores de los parámetros por defecto son evaluados durante la creación de la función, y f
es no la variable externa sino un parámetro de función que tendrá el valor que desea como predeterminado (por lo que esta lambda es solo una función con valores predeterminados para los parámetros, sin cerrar ninguna variable léxica).
similar a [generar funciones dentro del ciclo con la expresión lambda en python] (http://stackoverflow.com/questions/1841268/generating-functions-inside-loop-with-lambda-expression-in-python) – Rodrigue