2012-06-18 3 views
7

में लैम्ब्डा के साथ खराब मूल्यांकन एक लूप में, मैं बाद में दो नोड्स के दो मान() एस की तुलना को रोकने की कोशिश कर रहा हूं।पाइथन

class Node(): 
    def __init__(self, v): 
     self.v = v 
    def value(self): 
     return self.v 

nodes = [Node(0), Node(1), Node(2), Node(3), Node(4), Node(2)] 
results = [] 
for i in [0, 1, 2]: 
    j = i + 3 
    results.append(lambda: nodes[i].value() == nodes[j].value()) 

for result in results: 
    print result 

परिणाम सभी सत्य हैं (क्योंकि मैं, सभी lambdas के लिए j == 2,5)। जब तक इसे वास्तव में नहीं कहा जाता है, तब तक मैं लैम्ब्डा के निष्पादन को कैसे रोक सकता हूं, लेकिन सही परिवर्तनीय बाइंडिंग के साथ? और लैम्ब्डा में अभिव्यक्ति सभी आवश्यक समानता नहीं हैं ... अन्य शामिल अभिव्यक्तियों का एक गुच्छा है।

किसी भी मदद के लिए धन्यवाद!

+0

मुझे सच में यकीन नहीं है कि आप क्या करने की कोशिश कर रहे हैं। लैम्ब्डा अभिव्यक्ति यहां मेरे लिए अनावश्यक लगती है। आप केवल 'results.append नहीं कर सकते हैं (नोड्स [i] .value() == नोड्स [जे] .value()) '? आंशिक सुझाव देने के लिए – JAB

उत्तर

11

बाहरी स्कोप में देखने के बजाय i और j के वर्तमान मानों को बाध्य करने के लिए, आप या तो बंद या डिफ़ॉल्ट तर्क मान का उपयोग कर सकते हैं।

def make_comp_func(i, j): 
    return lambda: nodes[i].value() == nodes[j].value() 

for i in [0, 1, 2]: 
    j = i + 3 
    results.append(make_comp_func(i, j)) 
3

मुहावरेदार रास्ता एक डिफ़ॉल्ट तर्क का उपयोग करने के लिए है:

for i in [0, 1, 2]: 
    j = i + 3 
    results.append(lambda i=i, j=j: nodes[i].value() == nodes[j].value()) 

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

[f() for f in [lambda: i for i in range(3)]] 
[2, 2, 2] 

बदलें इस के लिए:

[f() for f in [lambda i=i: i for i in range(3)]] 
[0, 1, 2] 
5

एक और लैम्ब्डा में लपेट:

results.append((lambda x, y: lambda: nodes[x].value() == nodes[y].value()) (i, j)) 

या एक अच्छे तरीके से, partial साथ:

from functools import partial 

results.append(partial(lambda x, y: nodes[x].value() == nodes[y].value(), i, j)) 

डिफ़ॉल्ट तर्क चाल, ठीक है ... एक चाल है, और मैं से बचने के लिए सुझाव देंगे यह।

+1

+1। – jdi