Мне нужна функция обратного вызова, которая почти одинакова для серии событий графического интерфейса. Функция будет вести себя немного по-разному в зависимости от того, какое событие ее вызвало. Мне кажется простой случай, но я не могу понять этого странного поведения лямбда-функций.
Итак, у меня есть следующий упрощенный код ниже:
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()
Вывод этого кода:
mi
mi
mi
do
re
mi
Я ожидал:
do
re
mi
do
re
mi
Почему использование итератора все испортило?
Я пробовал использовать глубокую копию:
import copy
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
f()
Но здесь та же проблема.