¿Variables locales en funciones anidadas de Python?
Compila el cuerpo de la función, luego valida las variables "libres" (no definidas por asignaciones en la función misma) y las vincula a la función como unidades de cierre, con el código haciendo referencia a cada unidad usando un índice. . Por lo tanto, pet_function tiene una variable libre (jaula), a la que luego se hace referencia a través de la unidad de cierre, que a su vez tiene índice 0, apuntando a la variable local jaula en la función get_petters.
Cuando realmente llamas a la función, el cierre se usa para observar el valor en el alcance de la jaula. El problema está aquí. Cuando llamas a una función, ésta ya ha completado el cálculo de su resultado. Durante la ejecución, las variables locales se asignan una por una y la cadena contiene el último valor al final de la función. Entonces, cuando llame a cada función devuelta dinámicamente, obtendrá el valor impreso. get_petterscage'cow''dog''cat'cage'cat''cat'
La solución es no depender de cierres. Puede utilizar funciones parciales, crear nuevos alcances de funciones o vincular variables a valores predeterminados para argumentos de palabras clave.
Ejemplo de función parcial usando functools.partial():
de functools import parcialdef pet_function(cage=None):
imprimir "Mary acaricia la " jaula. animal "." rendimiento (animal, parcial(gotimes, parcial(pet_function, jaula=jaula)))
Crear un nuevo ejemplo de alcance:
def Scoped_cage(cage=None) :
def pet_ function():
imprimir "Mary mascota" jaula.animal ".
return pet_functionyield (animal, parcial(gotimes, Scoped_cage(jaula) ))
Vincula una variable al valor predeterminado de un argumento de palabra clave:
def pet_function(jaula=jaula).
imprime "Mary acaricia la " jaula .animal "." rendimiento (animal, parcial(gotimes, pet_function))
No es necesario utilizar Scoped_cage para definir la función en el bucle, y la compilación solo ocurre una vez, no en cada iteración de el bucle.