2011-09-25 38 views
20

संभव डुप्लिकेट लैम्ब्डा बनाना:
What do (lambda) function closures capture in Python?
lambda function don't closure the parameter in Python?एक पाश अंदर

मैं एक पाश अंदर lambdas बनाने के लिए कोशिश कर रहा हूँ कि वस्तुओं की एक सूची से अधिक दोहराता:

lambdas_list = [] 
for obj in obj_list: 
    lambdas_list.append(lambda : obj.some_var) 

अब, अगर मैं लैम्बडास पर फिर से चलाता हूं सूची और उन्हें इस तरह कॉल करें:

for f in lambdas_list: 
    print f() 

मुझे वही मान मिलता है। obj_list में यह अंतिम obj का मान है क्योंकि यह सूची इटरेटर के ब्लॉक में अंतिम चर था। कोड बनाने के लिए कोड के एक अच्छे (पायथनिक) को फिर से लिखने के लिए कोई विचार? बजाय इस लाइन

+1

देखें http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture-in-python/2295372#2295372, और http://stackoverflow.com/questions/7514093/lambda समारोह-न-बंद-पैरामीटर में अजगर। –

+0

सबसे वर्णनात्मक उत्तर: http://stackoverflow.com/questions/938429/scope-of-python-lambda-functions-and-their-parameters/938493#938493 –

उत्तर

22

उपयोग:

lambdas_list.append(lambda obj=obj: obj.some_var) 
+0

आंशिक उपयोग करने से अधिक सुरुचिपूर्ण। – zoujyjs

4

आप ऐसा ही कुछ कर सकते हैं:

def build_lambda(obj): 
    return lambda : obj.some_var 

lambdas_list = [] 
for obj in obj_list: 
    lambdas_list.append(build_lambda(obj)) 
8

आप या तो डिफ़ॉल्ट कार्य

lambdas_list = [ lambda i=o: i.some_var for o in obj_list ] 
का उपयोग कर चर पर कब्जा करने के लिए है

ओ आर, उपयोग बंद चर

lambdas_list = [ (lambda a: lambda: a.some_var)(o) for o in obj_list ] 

दोनों ही मामलों कुंजी obj_list सूची में सुनिश्चित करें कि प्रत्येक मूल्य के लिए एक अनूठा गुंजाइश के लिए असाइन किया गया है बनाने के लिए है में कब्जा करने के लिए।

आपका समाधान काम नहीं किया क्योंकि लेक्सिकल चर obj को मूल दायरे (for) से संदर्भित किया गया है।

डिफ़ॉल्ट असाइनमेंट काम किया क्योंकि हम दायरे से i का संदर्भ देते हैं। हम lambda परिभाषा का हिस्सा बनाकर और इसके दायरे को बनाकर परिवर्तनीय निहित "गुजरने" के लिए डिफ़ॉल्ट असाइनमेंट का उपयोग करते हैं।

बंद समाधान काम करता है क्योंकि चर "गुजर" स्पष्ट है, बाहरी lambda जो तुरंत क्रियान्वित किया जाता है में, इस प्रकार सूची समझ दौरान बंधन और और भीतरी lambda जो बाध्यकारी कि संदर्भ देता लौटने का निर्माण। तो जब आंतरिक lambda वास्तव में निष्पादित करता है तो यह बाहरी lambda दायरे में बनाए गए बाध्यकारी का संदर्भ देगा।