"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Cómo evitar resultados inesperados al modificar parámetros en funciones Lambda

Cómo evitar resultados inesperados al modificar parámetros en funciones Lambda

Publicado el 2024-11-18
Navegar:360

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

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
Declaración de liberación Este artículo se reimprime en: 1729329919 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

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