2009-05-30 12 views
49

मुझे पाइथन स्कॉइंग नियमों को समझने की कोशिश करने में भयानक समस्या है।पाइथन में मेरे वैश्विक चर को असाइन करने का काम क्यों नहीं किया जाता है?

a = 7 

def printA(): 
    print "Value of a is %d" % (a) 

def setA(value): 
    a = value 
    print "Inside setA, a is now %d" %(a) 


print "Before setA" 
printA() 
setA(42) 
print "After setA" 
printA() 

अप्रत्याशित (मेरे लिए) देता है के उत्पादन:

निम्न स्क्रिप्ट के साथ

 
    Before setA 
    Value of a is 7 
    Inside setA, a is now 42 
    After setA 
    Value of a is 7 

मैं एक के मूल्य का आखिरी मुद्रण कहाँ उम्मीद होती है 42, नहीं होने के लिए 7. वैश्विक चर के दायरे के लिए पाइथन के दायरे के नियमों के बारे में मुझे क्या याद आ रही है?

उत्तर

97

वैश्विक चर विशेष हैं। यदि आप फ़ंक्शन के अंदर एक वेरिएबल a = value को असाइन करने का प्रयास करते हैं, तो यह फ़ंक्शन के अंदर एक नया स्थानीय चर बनाता है, भले ही एक ही नाम के साथ वैश्विक चर हो। बजाय वैश्विक चर पहुंचने के लिए, समारोह के अंदर एक global statement जोड़ें:

a = 7 
def setA(value): 
    global a # declare a to be a global 
    a = value # this sets the global value of a 

भी Naming and binding देखें अजगर के नामकरण और बाध्यकारी नियमों का एक विस्तृत विवरण के लिए।

+12

* (असभ्य शब्द) * अजगर अंदर

global a

परिभाषित करने की जरूरत – theonlygusti

11

यह समझने की चाल यह है कि जब आप चर का उपयोग करते हैं, तो = = आप इसे स्थानीय चर के रूप में भी घोषित करते हैं। तो वैश्विक चर के मान को बदलने के बजाय, setA (मान) वास्तव में एक स्थानीय चर (जिसे एक कहा जाता है) को पास किए गए मान पर सेट करता है।

यदि आप मूल्य मुद्रित करने का प्रयास करते हैं तो यह अधिक स्पष्ट हो जाता है के इतने तरह Seta (मान) के शुरू में एक:

def setA(value): 
    print "Before assignment, a is %d" % (a) 
    a = value 
    print "Inside setA, a is now %d" % (a) 

आप इस अजगर को चलाने के लिए आप एक उपयोगी त्रुटि दे देंगे का प्रयास करें:

 
Traceback (most recent call last): 
    File "scopeTest.py", line 14, in 
    setA(42) 
    File "scopeTest.py", line 7, in setA 
    print "Before assignment, a is %d" % (a) 
UnboundLocalError: local variable 'a' referenced before assignment 

यह हमें बताता है कि अजगर का फैसला किया है कि setA (value) फ़ंक्शन में एक स्थानीय चर होता है जिसे आप कहते हैं, जिसे आप गधे करते समय बदलते हैं समारोह में इसे अनदेखा करें। यदि आप फ़ंक्शन में (जैसे printA() के साथ असाइन नहीं करते हैं) तो पायथन वैश्विक चर ए

वैरिएबल के रूप में चिह्नित करने के लिए आपको पाइथन, में वैश्विक कीवर्ड का उपयोग करने की आवश्यकता है कि आप वैश्विक चर का उपयोग करना चाहते हैं। इस मामले में जो setA (मान) फ़ंक्शन के भीतर है। तो स्क्रिप्ट हो जाता है:

a = 7 

def printA(): 
    print "Value of a is %d" % (a) 

def setA(value): 
    global a 
    a = value 
    print "Inside setA, a is now %d" %(a) 


print "Before setA" 
printA() 
setA(42) 
print "After setA" 
printA() 

यह एक लाइन इसके अलावा अजगर बताता है कि आप Seta (मूल्य) समारोह है कि आप वैश्विक चर, नहीं एक स्थानीय चर के बारे में बात कर रहे हैं में चर एक का उपयोग करते हैं।

2

पायथन में अन्य भाषाओं के रूप में चर की अवधारणा नहीं है। आपके पास ऐसी वस्तुएं हैं जो "कहीं" हैं और आपके पास इन वस्तुओं के संदर्भ हैं। = इन वस्तुओं को वर्तमान नामस्थान में संदर्भों के लिए असाइन करने के लिए उपयोग किया जाता है।

आप सेटए फ़ंक्शन के नामस्थान में एक नाम बनाते हैं जो उस ऑब्जेक्ट को संदर्भित करता है जिस पर मान संदर्भित करता है।

1

समारोह के अंदर, एक एक स्थानीय चर के रूप में व्यवहार किया जाता है, तो आप समारोह

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