Preciso de uma função de retorno de chamada que seja quase exatamente a mesma para uma série de eventos gui. A função terá um comportamento ligeiramente diferente, dependendo de qual evento a chamou. Parece um caso simples para mim, mas não consigo entender esse comportamento estranho das funções lambda.
Portanto, tenho o seguinte código simplificado abaixo:
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()
A saída deste código é:
mi
mi
mi
do
re
mi
Eu esperava:
do
re
mi
do
re
mi
Por que usar um iterador bagunçou as coisas?
Eu tentei usar uma deepcopy:
import copy
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
f()
Mas isso tem o mesmo problema.