ฉันต้องการฟังก์ชั่นการโทรกลับที่เกือบจะเหมือนกันทุกประการสำหรับชุดกิจกรรม gui ฟังก์ชันจะทำงานแตกต่างกันเล็กน้อยขึ้นอยู่กับเหตุการณ์ที่เรียกมัน ดูเหมือนจะเป็นกรณีธรรมดาสำหรับฉัน แต่ฉันไม่สามารถเข้าใจพฤติกรรมแปลก ๆ ของฟังก์ชันแลมด้านี้ได้
ดังนั้นฉันจึงมีโค้ดแบบง่ายต่อไปนี้ด้านล่าง:
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
เหตุใดการใช้ iterator จึงทำให้สิ่งต่างๆยุ่งเหยิง
ฉันได้ลองใช้ deepcopy:
import copy
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
f()
แต่นี่ก็มีปัญหาเหมือนกัน