Ho bisogno di una funzione di callback che sia quasi esattamente la stessa per una serie di eventi gui. La funzione si comporterà in modo leggermente diverso a seconda dell'evento che l'ha chiamata. Mi sembra un caso semplice, ma non riesco a capire questo strano comportamento delle funzioni lambda.
Quindi ho il seguente codice semplificato di seguito:
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()
L'output di questo codice è:
mi
mi
mi
do
re
mi
Mi aspettavo:
do
re
mi
do
re
mi
Perché l'uso di un iteratore ha incasinato le cose?
Ho provato a utilizzare una copia profonda:
import copy
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
f()
Ma questo ha lo stesso problema.