दिलचस्प पोस्ट
क्या स्ट्रिंग लिटरल्स कॉन्स्ट हैं? अपेक्षित iPv6 संगतता – आईओएस एप्पल ने एप्पल द्वारा खारिज कर दिया स्पार्क: नई लाइन की तुलना में अलग सीमांकक का उपयोग कर फाइल पढ़ना क्या सबसे अच्छा / सामान्य शांत यूआरएल क्रिया और क्रियाएं हैं? क्या सी / सी ++ में एक प्रकार का डाली है? स्प्रिंग सुरक्षा अभिव्यक्ति भाषा एनोटेशन में उपयोग के लिए कस्टम विधियाँ कैसे बनाएं कैसे CGAffineTransformMakeRotation उपयोग करने के लिए? दबाए बटन से पाठ प्राप्त करें jQuery को विशिष्ट विकल्प टैग टेक्स्ट मिलता है जावा में अपवादों को पकड़ने का आदेश सी ++ में अंतरिक्ष कैन करने के लिए कैसे? निर्माता चेतावनी में इसे लेक दिए गए फ़ाइल के लिए उपयोगकर्ता सिस्टम पसंदीदा संपादक कैसे खोलें? पृष्ठों के बीच एक वेबसॉकेट कनेक्शन को कैसे बनाए रखा जाए? स्विफ्ट में स्ट्रिंग के रूप में वस्तु का वर्ग नाम प्राप्त करें

पायथन लैम्ब्डा एक लूप में

निम्न कोड स्निपेट को ध्यान में रखते हुए:

# directorys == {'login': <object at ...>, 'home': <object at ...>} for d in directorys: self.command["cd " + d] = (lambda : self.root.change_directory(d)) 

मैं निम्न के रूप में दो फ़ंक्शन का एक शब्दकोश बनाने की अपेक्षा करता हूं:

 # Expected : self.command == { "cd login": lambda: self.root.change_directory("login"), "cd home": lambda: self.root.change_directory("home") } 

लेकिन ऐसा लगता है कि उत्पन्न दो लैम्ब्डा फ़ंक्शन बिल्कुल समान हैं:

 # Result : self.command == { "cd login": lambda: self.root.change_directory("login"), "cd home": lambda: self.root.change_directory("login") # <- Why login ? } 

मुझे सच में समझ में नहीं आता क्यों क्या तुम्हारे पास कोई सुझाव है ?

Solutions Collecting From Web of "पायथन लैम्ब्डा एक लूप में"

आपको प्रत्येक फ़ंक्शन के लिए डी बांधने की आवश्यकता है। ऐसा करने का एक तरीका यह है कि उसे एक डिफ़ॉल्ट मान के साथ एक पैरामीटर के रूप में देना है:

 lambda d=d: self.root.change_directory(d) 

अब फ़ंक्शन के अंदर डी पैरामीटर का उपयोग करता है, भले ही उसका एक ही नाम हो, और फ़ंक्शन बनने पर उसके लिए डिफ़ॉल्ट मान का मूल्यांकन किया जाता है। यह देखने में आपकी सहायता के लिए:

 lambda bound_d=d: self.root.change_directory(bound_d) 

याद रखें कि डिफ़ॉल्ट मान कैसे काम करते हैं, जैसे कि अदला-बदली वस्तुएं जैसे कि सूचियों और दिशानिर्देश, क्योंकि आप ऑब्जेक्ट बाध्यकारी हैं।

डिफ़ॉल्ट मूल्यों के साथ पैरामीटर की यह मुहिम काफी आम है, लेकिन यदि आप फ़ंक्शन मापदंडों को आत्मनिर्भर करते हैं और यह तय करते हैं कि उनकी मौजूदगी के आधार पर क्या करना है तो यह विफल हो सकता है। आप पैरामीटर से दूसरे बंद होने से बच सकते हैं:

 (lambda d=d: lambda: self.root.change_directory(d))() # or (lambda d: lambda: self.root.change_directory(d))(d) 

बेहतर अभी तक, आप "कमांड" कैसे संभालते हैं इसका एक नया डिज़ाइन यहां मदद करेगा और कहीं और मदद कर सकता है।

यह उस बिंदु के कारण है जिस पर घ बंधी हो रही है। लैम्ब्डा फ़ंक्शन के वर्तमान बिंदु के बजाय चर d पर सभी बिंदुओं का कार्य करता है, इसलिए जब आप अगले चलना में d अद्यतन करते हैं, तो यह अद्यतन आपके सभी कार्यों में देखा जाता है।

एक सरल उदाहरण के लिए:

 funcs = [] for x in [1,2,3]: funcs.append(lambda: x) for f in funcs: print f() # output: 3 3 3 

आप इसके आस-पास एक अतिरिक्त फ़ंक्शन जोड़कर इसे प्राप्त कर सकते हैं, जैसे:

 def makeFunc(x): return lambda: x funcs = [] for x in [1,2,3]: funcs.append(makeFunc(x)) for f in funcs: print f() # output: 1 2 3 

आप लैम्ब्डा अभिव्यक्ति के अंदर स्क्रॉपिंग को भी ठीक कर सकते हैं

 lambda bound_x=x: bound_x 

हालांकि सामान्य तौर पर यह अच्छा अभ्यास नहीं है जैसा आपने अपने फ़ंक्शन के हस्ताक्षर को बदल दिया है।

मैं एक ही समस्या से मिला चयनित समाधान ने मुझे बहुत मदद की, लेकिन मुझे एक प्रश्न को कार्यात्मक बनाने के लिए एक सटीक जोड़ना आवश्यक है: लूप के बाहर लैम्ब्डा फ़ंक्शन को परिभाषित करें। वैसे, डिफ़ॉल्ट मान आवश्यक नहीं है।

 foo = lambda d: lambda : self.root.change_directory(d) for d in directorys: self.command["cd " + d] = (foo(d))