Saya membutuhkan fungsi panggilan balik yang hampir persis sama untuk serangkaian acara gui. Fungsi ini akan berperilaku sedikit berbeda bergantung pada peristiwa mana yang memanggilnya. Sepertinya kasus yang sederhana bagi saya, tetapi saya tidak dapat memahami perilaku aneh fungsi lambda ini.
Jadi saya memiliki kode yang disederhanakan berikut ini:
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()
Output dari kode ini adalah:
mi
mi
mi
do
re
mi
Saya mengharapkan:
do
re
mi
do
re
mi
Mengapa menggunakan iterator mengacaukan segalanya?
Saya sudah mencoba menggunakan deepcopy:
import copy
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
f()
Tetapi ini memiliki masalah yang sama.