J'ai besoin d'une fonction de rappel qui soit presque exactement la même pour une série d'événements gui. La fonction se comportera légèrement différemment en fonction de l'événement qui l'a appelée. Cela me semble être un cas simple, mais je n'arrive pas à comprendre ce comportement bizarre des fonctions lambda.
J'ai donc le code simplifié suivant :
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
Je m'y attendais :
do
re
mi
do
re
mi
Pourquoi l'utilisation d'un itérateur a perturbé 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.