2011-06-01 17 views
16

मैं चर नेस्टिंग समारोह में परिभाषित नेस्टेड समारोह में बदला जा करने के लिए चाहते हैं, उसमें कुछमैं कैसे समारोह के चर नेस्टेड समारोह

def nesting(): 
    count = 0 
    def nested(): 
     count += 1 

    for i in range(10): 
     nested() 
    print count 

तरह घोंसला बनाने से बदल सकता हूँ, जब घोंसले समारोह कहा जाता है, मैं इच्छा है कि यह 10 प्रिंट करता है, लेकिन यह UnboundLocalError उठाता है। वैश्विक शब्द वैश्विक इसे हल कर सकता है। लेकिन चूंकि परिवर्तनीय गणना केवल घोंसले के कार्य के दायरे में उपयोग की जाती है, इसलिए मुझे उम्मीद है कि यह वैश्विक घोषित न करे। ऐसा करने का अच्छा तरीका क्या है?

+1

संभव डुप्लिकेट (http://stackoverflow.com/questions/7935966/python-overwriting-variables-in-nested-functions) – ikdc

उत्तर

21

अजगर 3.x में, आप nonlocal घोषणा (nested में) का उपयोग अजगर बताने के लिए आप nesting में count चर के लिए आवंटित करने के लिए हो सकता है।

पायथन 2.x में, आप nested से nesting में count को असाइन नहीं कर सकते हैं। हालांकि, अगर आप कर सकते हैं चर खुद को बताए नहीं है, लेकिन एक परिवर्तनशील कंटेनर का उपयोग करके इसे चारों ओर काम:

def nesting(): 
    count = [0] 
    def nested(): 
     count[0] += 1 

    for i in range(10): 
     nested() 
    print count[0] 

हालांकि गैर तुच्छ मामलों के लिए, हमेशा की तरह अजगर दृष्टिकोण एक में डेटा और कार्यक्षमता रैप करने के लिए है बंद करने का उपयोग करने के बजाय कक्षा।

+0

आप क्या कर सकते हैं बाहरी समारोह से बंद करने के अंदर चर को बांधना है, लेकिन दूसरी तरफ नहीं। इस मामले पर विचार (जब माता-पिता fucntion गुंजाइश दूर चला गया है): डीईएफ़ एक(): परीक्षण = 50 डीईएफ़ ख (y): वापसी परीक्षण + y ख वापसी चल रहा है एक एक समारोह है कि 50 कहते हैं वापस आ जाएगी इसके पैरामीटर के लिए। यह परीक्षण को संशोधित नहीं करता है, और परीक्षण बाध्य है। यदि आपने 'ए' को पैरामीटर किया है, तो आप differennt bs उत्पन्न कर सकते हैं - बल्कि उच्च ऑर्डर लिस्प फ़ंक्शंस की तरह। Py3K संकेत के लिए –

+1

+1 – gecco

4

थोड़ा सा देर से, आप कोई विशेषता "घोंसले" समारोह इतना तरह संलग्न कर सकते हैं:

def nesting(): 

    def nested(): 
     nested.count += 1 
    nested.count = 0 

    for i in range(10): 
     nested() 
    return nested 

c = nesting() 
print(c.count) 
0

मेरे लिए सबसे सुरुचिपूर्ण दृष्टिकोण: दोनों अजगर संस्करणों पर 100% काम करता है।

def ex8(): 
    ex8.var = 'foo' 
    def inner(): 
     ex8.var = 'bar' 
     print 'inside inner, ex8.var is ', ex8.var 
    inner() 
    print 'inside outer function, ex8.var is ', ex8.var 
ex8() 

inside inner, ex8.var is bar 
inside outer function, ex8.var is bar 

अधिक: http://www.saltycrane.com/blog/2008/01/python-variable-scope-notes/

[नेस्टेड कार्यों में अजगर को अधिलेखित चर] की
संबंधित मुद्दे