2012-10-11 20 views
6

इस उदाहरण पर विचारलैम्ब्डा

def dump(value): 
    print value 

items = []  
for i in range(0, 2): 
    items.append(lambda: dump(i)) 

for item in items: 
    item() 

उत्पादन:

1 
1 

मैं कैसे प्राप्त कर सकते हैं:

0 
1 

उत्तर

5

आप पर कोई डिफ़ॉल्ट मान के साथ एक पैरामीटर का उपयोग कर सकते हैं लैम्ब्डा:

for i in range(0, 2): 
    items.append(lambda i=i: dump(i)) 

यह काम करता है क्योंकि फ़ंक्शन परिभाषित होने पर डिफ़ॉल्ट मान का मूल्यांकन किया जाता है, जब इसे कॉल नहीं किया जाता है।

+0

आदमी, आप स्मार्ट हैं। यह उदाहरण था लेकिन आपको कामकाज मिला, बिंदु यह था कि लैम्बडा परिभाषा पर उस संदर्भ को कैसे निकाला जाए। क्या ऐसा करने का कोई तरीका है? – bradojevic

4

आप उपयोग कर सकते हैं:

for i in range(0, 2): 
    items.append(lambda i=i: dump(i)) 

i

यह काम करता है क्योंकि डिफ़ॉल्ट पैरामीटर मान समारोह निर्माण समय पर मूल्यांकन किया जाता है के वर्तमान मूल्य पर कब्जा करने, और i बाहरी चर, लेकिन कार्य नहीं है पैरामीटर जिसमें वह मान होगा जो आप डिफ़ॉल्ट रूप से चाहते हैं।

इस answer में एक और विस्तृत स्पष्टीकरण मिल सकता है।

0

आउटपुट मूल्य फ़ंक्शन के मूल्यांकन पर मेरा मूल्य है, न कि इसकी घोषणा पर। यही कारण है कि आपको वांछित परिणाम नहीं मिलते हैं।

1

पूर्णता के लिए, आप भी कर सकते हैं:

for i in range(0, 2): 
    items.append((lambda i: lambda: dump(i))(i)) 
+0

मुझे लगता है कि यह उत्तर कम से कम हैकी है, भले ही यह डिफ़ॉल्ट मान उत्तर से अधिक वर्बोज़ है। – max

संबंधित मुद्दे