Мені потрібна функція зворотного виклику, яка майже однакова для серії подій графічного інтерфейсу. Функція буде поводитися дещо інакше, залежно від того, яка подія її викликала. Мені здається простим випадком, але я не можу зрозуміти цю дивну поведінку лямбда-функцій.
Отже, у мене є такий спрощений код нижче:
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()
Але у цього та сама проблема.