Tôi cần một hàm gọi lại gần như giống hệt nhau cho một loạt các sự kiện gui. Hàm sẽ hoạt động hơi khác một chút tùy thuộc vào sự kiện nào đã gọi nó. Có vẻ như một trường hợp đơn giản với tôi, nhưng tôi không thể tìm ra hành vi kỳ lạ này của các hàm lambda.
Vì vậy, tôi có mã đơn giản sau đây:
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()
Đầu ra của mã này là:
mi
mi
mi
do
re
mi
Tôi mong đợi:
do
re
mi
do
re
mi
Tại sao việc sử dụng trình lặp lại làm mọi thứ rối tung lên?
Tôi đã thử sử dụng một nội soi sâu:
import copy
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
f()
Nhưng điều này có cùng một vấn đề.