आप उत्तर जानते हैं: हाँ। ;) आराम करें, हालांकि, यह उभरते पायथनिस्टों के लिए एक बहुत ही आम खोज है। जब आप फ़ंक्शन या लैम्ब्डा को परिभाषित करते हैं, तो संदर्भ फ़ंक्शन उस फ़ंक्शन के अंदर "बनाए गए" नहीं होते हैं, यह चर पर एक बंद बनाता है। प्रभाव यह है कि फ़ंक्शन को कॉल करते समय आपको वैरिएबल का मान मिलता है, परिभाषा समय पर मान नहीं। (आप बाद वाले की उम्मीद कर रहे थे।)
इससे निपटने के कुछ तरीके हैं। प्रथम अतिरिक्त चर बाध्यकारी है:
funcs = []
for x in range(10):
funcs.append(lambda x=x: x)
print [f() for f in funcs]
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
दूसरा तरीका थोड़ा और अधिक औपचारिक है:
from functools import partial
funcs = []
for x in range(10):
funcs.append(partial(lambda x: x, x))
print [f() for f in funcs]
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
स्रोत
2009-12-17 20:16:43
आम सवाल पूछा, (और जवाब) कम से कम एक बार पहले: http://stackoverflow.com/questions/233673/लेक्सिकल-क्लोजर-इन-पायथन –
@Vladimir: हाँ, लेकिन दोनों का शीर्षक काफी अलग है, मुझे कभी नहीं लगता कि वे एक ही चीज़ के बारे में हैं। – OscarRyz