] हालांकि, अप्रत्याशित व्यवहार से बचने के लिए उनके पैरामीटर स्कोपिंग को समझना महत्वपूर्ण हो सकता है। आइए एक सामान्य मुद्दे का पता लगाएं जो लूप के भीतर लैम्ब्डा कार्यों का उपयोग करते समय उत्पन्न होता है। प्रिंट एमएसजी # एक पुनरावृत्ति का उपयोग करके गलत दृष्टिकोण फंककिस्ट = [] m में ('do', 're', 'mi') के लिए: FunClist.Append (लैम्ब्डा: कॉलबैक (एम)) # सही दृष्टिकोण एक समय में एक बनाना फंककिस्ट = [] funclist.append (लैम्ब्डा: कॉलबैक ('डू')) funclist.append (लैम्ब्डा: कॉलबैक ('re')) funclist.append (लैम्ब्डा: कॉलबैक ('एमआई')) # कॉलबैक फ़ंक्शंस निष्पादित करें Funclist में f के लिए: f ()
जब निष्पादित किया जाता है, तो कोड अप्रत्याशित रूप से प्रिंट करता है:
mi एम आई एम आई करना दोबारा Mi के बजाय अपेक्षित आउटपुट के बजाय:
करते हैं दोबारा एम आई करना दोबारा Mi
स्पष्टीकरण
लैम्ब्डा कार्यों के दायरे को समझना और उनके मापदंडों को यहाँ महत्वपूर्ण है। नियमित कार्यों के विपरीत, लैम्ब्डा फ़ंक्शन आसपास के वातावरण को संदर्भित करता है जिसमें वे बनाए जाते हैं। इस संदर्भ में लैम्ब्डा के शरीर के भीतर उपयोग किए जाने वाले चर शामिल हैं।
def callback(msg): print msg # Incorrect approach using an iterator funcList = [] for m in ('do', 're', 'mi'): funcList.append(lambda: callback(m)) # Correct approach creating one at a time funcList = [] funcList.append(lambda: callback('do')) funcList.append(lambda: callback('re')) funcList.append(lambda: callback('mi')) # Execute the callback functions for f in funcList: f()जब गलत दृष्टिकोण में एक पुनरावृत्ति का उपयोग किया जाता है, तो लूप में प्रत्येक तत्व m के लिए, यह एक नया लैम्ब्डा फ़ंक्शन बनाता है जो एक ही चर m का संदर्भ देता है। हालांकि, लूप पूरा होने के बाद, चर एम लूप में अंतिम तत्व का संदर्भ देता है, अर्थात, 'एमआई'। इसलिए, जब कॉलबैक फ़ंक्शन निष्पादित किए जाते हैं, तो वे सभी अद्यतन संदर्भ का उपयोग करके 'mi' प्रिंट करते हैं। 're', 'mi'): funclist.append (lambda m = m: कॉलबैक (m))
अब, प्रत्येक लैम्ब्डा फ़ंक्शन के भीतर, m को एक स्थानीय चर के रूप में कैप्चर किया जाता है, और लूप पूरा होने पर इसका मूल्य संरक्षित होता है। नतीजतन, जब कॉलबैक फ़ंक्शन निष्पादित किए जाते हैं, तो वे सही मान प्रिंट करते हैं, जिसके परिणामस्वरूप अपेक्षित आउटपुट होता है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3