Potrzebuję funkcji zwrotnej, która jest prawie dokładnie taka sama dla serii zdarzeń GUI. Funkcja zachowuje się nieco inaczej w zależności od tego, które zdarzenie ją wywołało. Wydaje mi się, że to prosty przypadek, ale nie potrafię zrozumieć tego dziwnego zachowania funkcji lambda.
Więc mam następujący uproszczony kod poniżej:
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()
Wynik tego kodu to:
mi
mi
mi
do
re
mi
Oczekiwałem:
do
re
mi
do
re
mi
Dlaczego użycie iteratora zepsuło sprawę?
Próbowałem użyć deepcopy:
import copy
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
f()
Ale to ma ten sam problem.