J'ai besoin d'une fonction de rappel qui est presque exactement la même pour une série d'événements d'interface graphique. La fonction se comportera légèrement différemment selon l'événement qui l'a appelée. Cela me semble être un cas simple, mais je ne peux pas comprendre ce comportement étrange des fonctions lambda.
J'ai donc le code simplifié suivant ci-dessous:
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 sortie de ce code est:
mi
mi
mi
do
re
mi
J'esperais:
do
re
mi
do
re
mi
Pourquoi l'utilisation d'un itérateur a-t-il gâché les choses?
J'ai essayé d'utiliser une copie profonde:
import copy
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
f()
Mais cela pose le même problème.