Alcance de las funciones Lambda y sus parámetros
Las funciones Lambda son funciones anónimas que pueden capturar el alcance de su función adjunta. Esto les permite acceder a variables y parámetros desde el ámbito principal. Sin embargo, este comportamiento a veces puede generar resultados inesperados cuando las funciones lambda usan parámetros que se modifican dentro de la función adjunta.
Para ilustrar el problema, considere el siguiente código:
def callback(msg):
print(msg)
# Creating a list of function handles with an iterator
funcList = []
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(m))
# Calling the lambda functions
for f in funcList:
f()
El resultado esperado de este código es:
do re mi
Sin embargo, el resultado real es:
mi mi mi
Esto se debe a que las funciones lambda capturan una referencia a la variable m desde el alcance adjunto. Cuando el iterador ejecuta el bucle, asigna el valor 'mi' a m en la iteración final. Como resultado, todas las funciones lambda tienen una referencia a 'mi' cuando se ejecutan, aunque se les pasaron valores diferentes durante la creación.
Para resolver este problema, puede capturar el valor de m en el momento de creación de la función lambda usándola como valor predeterminado de un parámetro opcional:
for m in ('do', 're', 'mi'):
funcList.append(lambda m=m: callback(m))
Esto garantiza que cada función lambda tenga acceso a su propia copia de m, capturando el valor que se asignó durante la iteración del bucle. La salida de este código será:
do re mi
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3