Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Variables locales en funciones anidadas de Python?

¿Variables locales en funciones anidadas de Python?

Las funciones anidadas buscan variables del ámbito principal en el momento de la ejecución, no en el momento de la definición.

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.