Necesito una función de devolución de llamada que sea casi exactamente la misma para una serie de eventos de GUI. La función se comportará de forma ligeramente diferente según el evento que la haya llamado. Parece un caso simple para mí, pero no puedo entender este extraño comportamiento de las funciones lambda.Alcance de las funciones lambda y sus parámetros?
así que tengo el siguiente código simplificado a continuación:
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))
for f in funcList:
f()
#create one at a time
funcList=[]
funcList.append(lambda: callback('do'))
funcList.append(lambda: callback('re'))
funcList.append(lambda: callback('mi'))
for f in funcList:
f()
La salida de este código es:
mi
mi
mi
do
re
mi
que esperaba:
do
re
mi
do
re
mi
¿Por qué se utiliza un repetidor en mal estado ¿cosas claras?
He intentado usar un deepcopy:
import copy
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
f()
Pero esto tiene el mismo problema.
El título de su pregunta es algo engañoso. – lispmachine
¿Por qué usar lambdas si los encuentras confusos? ¿Por qué no usar def para definir funciones? ¿De qué se trata tu problema que hace que lambdas sea tan importante? –
@ S.Lott La función anidada dará como resultado el mismo problema (tal vez más claramente visible) – lispmachine