Necesito una función de devolución de llamada que sea casi exactamente igual para una serie de eventos de interfaz gráfica de usuario. La función se comportará de forma ligeramente diferente según el evento que la haya llamado. Me parece un caso simple, pero no puedo entender este comportamiento extraño de las funciones lambda.
Entonces 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()
El resultado de este código es:
mi
mi
mi
do
re
mi
Esperaba:
do
re
mi
do
re
mi
¿Por qué el uso de un iterador arruinó las cosas?
Intenté usar una copia profunda:
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.