2016-04-23 7 views
16

मैं अजगर 3.5.1 में निम्न कोड की कोशिश की देता है:लैम्ब्डा कार्यों के साथ शब्दकोश समझ गलत परिणाम

>>> f = {x: (lambda y: x) for x in range(10)} 
>>> f[5](3) 
9 

यह स्पष्ट है कि इस 5 लौटना चाहिए। मुझे समझ में नहीं आता कि दूसरा मूल्य कहां से आता है, और मैं कुछ भी नहीं ढूंढ पाया।

ऐसा लगता है कि यह संदर्भ से संबंधित कुछ है - यह हमेशा f[9] का उत्तर देता है, जो अंतिम कार्य सौंपा गया है।

यहां क्या त्रुटि है, और यह कैसे किया जाना चाहिए ताकि यह ठीक से काम करे?

उत्तर

14

पायथन स्कॉइंग लेक्सिकल है। एक बंदरिएबल के नाम और दायरे को संदर्भित करेगा, न कि वास्तविक वस्तु/चर के मान।

क्या होता है कि प्रत्येक लैम्ब्डा परिवर्तनीय xx का मान कैप्चर कर रहा है।

पाश चर x 9 के लिए बाध्य है के अंत में, इसलिए हर लैम्ब्डा इस x जिसका मूल्य के पास भेजेगा 9.

है क्यों @ ChrisP का जवाब काम करता है:

make_func मूल्यांकन के लिए x के मान को मजबूर करता है (क्योंकि यह एक समारोह में पारित किया गया है)। इस प्रकार, लैम्ब्डा x वर्तमान में के मान के साथ बनाया गया है और हम उपरोक्त स्कोपिंग मुद्दे से बचते हैं।

def make_func(x): 
    return lambda y: x 

f = {x: make_func(x) for x in range(10)} 
+7

एक वैकल्पिक आशुलिपि 'f किया जाएगा = {x: (लैम्ब्डा y, x = x: एक्स) रेंज में एक्स के लिए (10)}', क्योंकि समारोह डिफ़ॉल्ट तर्क परिभाषा समय में बंधे हुए हैं, इसलिए वे 'x' के _value_ को बांधेंगे, न कि _name_' x'। – ShadowRanger

+0

यह एक बहुत बेवकूफ सवाल की तरह लग सकता है (मैं लैम्ब्डा से बहुत परिचित नहीं हूं), लेकिन make_func (x) कैसे काम करता है? मैं कल्पना कर सकता हूं कि एफ [5] (3) का अर्थ है -> एफ = {5: make_func (5)}। तो यह कैसे है कि make_func (5) (3) 5 के बराबर है? – Adib

+1

शब्दकोश समझ में कार्यों की मानों के लिए इंट्स की एक कुंजी कुंजी बनाता है। एफ [5] 5 द्वारा की गई कुंजीपटल में मान देता है जो फ़ंक्शन लैम्ब्डा वाई: x होता है। ध्यान दें कि लैम्ब्डा जो कुछ भी पारित होता है उसे अनदेखा करता है और हमेशा x देता है। यही कारण है कि लैम्ब्डा या तो 5 या 9 लौटाएगा (ऊपर वर्णित मुद्दे के कारण)। – gnicholas

6

निम्नलिखित काम करना चाहिए:

def make_func(x): 
    return lambda y: x 

f = {x: make_func(x) for x in range(10)} 

x अपने कोड में पिछले x मूल्य है, जो 9 है की चर्चा करते हुए समाप्त होता है, लेकिन मेरा में यह समारोह दायरे में x को दर्शाता है।

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