"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > लूप्स में लैंबडा फ़ंक्शन स्कोप और मापदंडों में अप्रत्याशित व्यवहार से कैसे बचें?

लूप्स में लैंबडा फ़ंक्शन स्कोप और मापदंडों में अप्रत्याशित व्यवहार से कैसे बचें?

2025-03-24 को पोस्ट किया गया
ब्राउज़ करें:817

] हालांकि, अप्रत्याशित व्यवहार से बचने के लिए उनके पैरामीटर स्कोपिंग को समझना महत्वपूर्ण हो सकता है। आइए एक सामान्य मुद्दे का पता लगाएं जो लूप के भीतर लैम्ब्डा कार्यों का उपयोग करते समय उत्पन्न होता है। प्रिंट एमएसजी # एक पुनरावृत्ति का उपयोग करके गलत दृष्टिकोण फंककिस्ट = [] m में ('do', 're', 'mi') के लिए: FunClist.Append (लैम्ब्डा: कॉलबैक (एम)) # सही दृष्टिकोण एक समय में एक बनाना फंककिस्ट = [] funclist.append (लैम्ब्डा: कॉलबैक ('डू')) funclist.append (लैम्ब्डा: कॉलबैक ('re')) funclist.append (लैम्ब्डा: कॉलबैक ('एमआई')) # कॉलबैक फ़ंक्शंस निष्पादित करें Funclist में f के लिए: f ()

How to Avoid Unexpected Behavior in Lambda Function Scope and Parameters in Loops? जब निष्पादित किया जाता है, तो कोड अप्रत्याशित रूप से प्रिंट करता है:

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 को एक स्थानीय चर के रूप में कैप्चर किया जाता है, और लूप पूरा होने पर इसका मूल्य संरक्षित होता है। नतीजतन, जब कॉलबैक फ़ंक्शन निष्पादित किए जाते हैं, तो वे सही मान प्रिंट करते हैं, जिसके परिणामस्वरूप अपेक्षित आउटपुट होता है।
            
विज्ञप्ति वक्तव्य इस लेख को पुन: पेश किया गया है: 1729329977 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए [email protected] पर संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3