Tengo un simple código siguiente:comportamiento extraño en el cierre pitón
def get():
return [lambda: i for i in [1, 2, 3]]
for f in get():
print(f())
como se espera de mi conocimiento pitón, la salida es 3 - lista completa contendrá último valor de i
. ¿Pero cómo funciona esto internamente?
AFAIK, las variables de python son simplemente referencias a los objetos, por lo que el primer cierre debe incluir la primera referencia del objeto i
- y este objeto es definitivamente 1, no 3 O_O. ¿Cómo sucede que el cierre de python incluye la variable en sí misma en lugar de objeto esta referencia de variable? ¿Guarda el nombre de la variable como texto sin formato, alguna "referencia a la variable" o qué?
¿Hay alguna información adicional disponible sobre el tema para que pueda ver qué variables ocultas se usan para "guardar" el alcance, acceder a él, etc.? – grigoryvp
'(lambda x: lambda: x) (i)' es una de las cosas más feas que he visto hacer en Python. Ick. (No es que su respuesta sea incorrecta o mala, per se, solo dice: es difícil de leer). –
@EyeofHell: Creo que [pep-227] (http://www.python.org/dev/peps/pep-0227/) es el documento canónico sobre las reglas de alcance de Python. Además, hay algunas buenas respuestas aquí en SO, p. [aquí] (http://stackoverflow.com/questions/291978/short-description-of-python-scoping-rules) – georg