ฟังก์ชั่น (แลมบ์ดา) ปิดการจับภาพอย่างไร
เมื่อเร็ว ๆ นี้ฉันเริ่มเล่นกับ Python และฉันพบสิ่งแปลก ๆ ในวิธีการปิดการทำงาน พิจารณารหัสต่อไปนี้: adders=[0,1,2,3] for i in [0,1,2,3]: adders[i]=lambda a: i+a print adders[1](3) มันสร้างอาเรย์อย่างง่ายของฟังก์ชั่นที่รับอินพุตเดี่ยวและส่งคืนอินพุตที่เพิ่มโดยตัวเลข ฟังก์ชั่นที่มีการสร้างขึ้นในforวงที่การทำซ้ำโดยiวิ่งจากไป0 3สำหรับตัวเลขเหล่านี้แต่ละlambdaฟังก์ชั่นจะถูกสร้างขึ้นเพื่อรวบรวมiและเพิ่มเข้าไปในอินพุตของฟังก์ชัน บรรทัดสุดท้ายเรียกใช้lambdaฟังก์ชันที่สองโดย3ใช้เป็นพารามิเตอร์ 6ที่แปลกใจของการส่งออกเป็น 4ผมคาดว่า เหตุผลของฉันคือ: ใน Python ทุกอย่างเป็นวัตถุดังนั้นทุกตัวแปรจึงเป็นตัวชี้ที่สำคัญสำหรับมัน เมื่อสร้างlambdaปิดสำหรับผมคาดว่ามันเก็บชี้ไปยังวัตถุจำนวนเต็มชี้ปัจจุบันโดยi iนั่นหมายความว่าเมื่อiกำหนดวัตถุจำนวนเต็มใหม่มันจะไม่ส่งผลต่อการปิดที่สร้างไว้ก่อนหน้านี้ น่าเศร้าที่การตรวจสอบaddersอาร์เรย์ภายในโปรแกรมดีบั๊กเกอร์แสดงว่าทำเช่นนั้น ทุกlambdaฟังก์ชั่นหมายถึงค่าสุดท้ายของi, 3ซึ่งส่งผลให้กลับมาadders[1](3)6 ซึ่งทำให้ฉันสงสัยเกี่ยวกับสิ่งต่อไปนี้: สิ่งที่ปิดการจับภาพที่แน่นอน? เป็นวิธีที่สวยงามที่สุดในการโน้มน้าวให้lambdaฟังก์ชั่นในการจับมูลค่าปัจจุบันiในทางที่จะไม่ได้รับผลกระทบเมื่อiเปลี่ยนค่าของมันคืออะไร?