2012-03-30 2 views
6

में वैश्विक चर भ्रम मेरे पास एक वैश्विक चर है जो मैं डिफ़ॉल्ट चर के रूप में उपयोग कर रहा हूं। मेरे कार्यक्रम में जो होता है उसके आधार पर मुझे उन डिफ़ॉल्टों को बदलने की क्षमता की आवश्यकता होती है और मेरे कोड के शेष संचालन के माध्यम से परिवर्तन जारी रहते हैं। मैं उन्हें हर जगह बदलना और परिभाषित करना चाहता हूं इसलिए मैंने वैश्विक चर का उपयोग किया। यहां कुछ परीक्षण कोड दिए गए हैं जो दिखाते हैं कि मैं इन चरों को संशोधित करने का प्रयास कैसे कर रहा हूं।पाइथन

जब मैं यह कर मैं निम्नलिखित समस्या है ...

  1. कार्यक्रम सोचता है कि myGlobal मुख्य में परिभाषित नहीं किया गया है। लेकिन है। क्यूं कर?
  2. जब मैं myGlobal बदलता हूं तो मैं एक सबराउटिन को कॉल करता हूं। मैं नहीं चाहता था कि ऐसा हो।

मैं जो करने की कोशिश कर रहा हूं उसे पूरा करने का सही तरीका क्या है? उदाहरण?

def main(argv): 
    global myGlobal 
    #... 
    myGlobal = "bar" 

अन्यथा काम बस एक नया बना देगा:

#!/usr/bin/python 

import sys 

myGlobal = "foo" 

print "********************" 
print "MyGlobal %s" % myGlobal 
print "********************" 


def main(argv): 

    #UnboundLocalError: local variable 'myGlobal' referenced before assignment 
    print '1. Printing the global again: ' + myGlobal 

    myGlobal = "bar" 
    print "2. Change the global and print again: " + myGlobal 

    # now call a subroutine 
    mySub() 

# Checks for output file, if it doesn't exist creates one 
def mySub(): 
    # Why isn't the global "bar" not "foo"? 
    print '3. Printing the global again: ' + myGlobal 

    myGlobal = "black sheep" 
    print "4. Change the global and print again: " + myGlobal 




if __name__ == "__main__": 
    main(sys.argv[1:]) 

उत्तर

8

आप चाहते हैं के लिए असाइन करते हैं, बजाय एक समारोह के भीतर से एक मॉड्यूल-वैश्विक चर पढ़ा, तो आप global कीवर्ड की जरूरत है स्थानीय चर जो आपके वैश्विक चर को छाया देता है (इसलिए इसमें परिवर्तन वैश्विक चर को प्रभावित नहीं करेंगे, जैसे कि यह आपके उदाहरण में है)।

कहा कि, आप भी एक अच्छे तरह से यहाँ एक वर्ग इस्तेमाल कर सकते हैं अपने कार्यों में हिस्सेदारी राज्य के लिए:

class MyApp(object): 
    def main(self, argv): 
    self.myVar = "bar" 
    self.mySub() 

    def mySub(self): 
    print self.myVar 

MyApp().main(sys.argv[1:]) 
2

क्या आप देख रहे हैं अजगर में global statement है। main और mySub में अपने कोडब्लॉक से पहले global myGlobal डालें और वहां आपके पास अनुमानित व्यवहार है। ऐसा कहकर, यदि आपको कार्यों के बीच राज्य की जानकारी पास करनी है, तो फ़ंक्शन में तर्क का उपयोग करें। यह बहुत साफ है।