Ich benötige eine Rückruffunktion, die für eine Reihe von GUI-Ereignissen fast identisch ist. Die Funktion verhält sich etwas anders, je nachdem, welches Ereignis sie aufgerufen hat. Scheint mir ein einfacher Fall zu sein, aber ich kann dieses seltsame Verhalten von Lambda-Funktionen nicht herausfinden.
Ich habe also den folgenden vereinfachten Code unten:
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()
Die Ausgabe dieses Codes lautet:
mi
mi
mi
do
re
mi
Ich erwartete:
do
re
mi
do
re
mi
Warum hat die Verwendung eines Iterators die Dinge durcheinander gebracht?
Ich habe versucht, eine Deepcopy zu verwenden:
import copy
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
f()
Das hat aber das gleiche Problem.