2013-05-11 8 views
8

के अंदर वैश्विक चर वैरिएबल मुख्य रूप से एक वैरिएबल वैरिएबल को परिभाषित करना चाहता था, यानी एक चर जो कि मुख्य फ़ंक्शन से कॉल किए गए किसी भी फ़ंक्शन द्वारा उपयोग किया जा सकता है।मुख्य फ़ंक्शन पाइथन

क्या यह संभव है? ऐसा करने का एक अच्छा तरीका क्या होगा?

धन्यवाद!

+1

तुम सिर्फ में उस चर पारित नहीं की जा सकती तर्क के रूप में? –

+0

हां, मैं कर सकता था, लेकिन मैं यह देखने की कोशिश कर रहा था कि मुख्य कार्य के अंदर वैश्विक युद्धों को परिभाषित करना संभव होगा, शायद यह एक बुरा विचार है ... – Dnaiel

+0

वैश्विक चर केवल एक बार फिर से कोड होने के बाद परेशान हो जाते हैं। छोटे कोड के लिए, हालांकि, वे ठीक हैं। – astronautlevel

उत्तर

2

एक चर के अंदर एक विधि (उदाहरण के लिए, मुख्य) परिभाषा द्वारा स्थानीय है। हालांकि, आप विधि के बाहर एक वैश्विक चर बना सकते हैं, और किसी भी अन्य विधि से अपने मूल्य को एक्सेस और बदल सकते हैं।

इसके मूल्य को बदलने के लिए global कीवर्ड का उपयोग करें।

+0

मैं अंदर एक चर परिभाषित करने की कोशिश कर रहा हूं मुख्य कार्य जिसे मैं अन्य कार्यों से उपयोग कर सकता हूं जिन्हें मैं मुख्य से कॉल करता हूं। शायद आप सही हैं, और यह करने योग्य नहीं है क्योंकि मुख्य सिर्फ एक विधि है। – Dnaiel

+0

@Dnaiel इसके लिए आप प्रोग्राम के विभिन्न हिस्सों के बीच संवाद करने के लिए पैरामीटर का उपयोग कर सकते हैं। मुझे इस तरह से पता नहीं है कि आप एक फ़ंक्शन के अंदर से ग्लोबल वैरिएबल को परिभाषित कर सकते हैं। – Levon

+0

धन्यवाद, आपको सही लगता है! – Dnaiel

9

जो आप चाहते हैं वह संभव नहीं है *। आप वैश्विक नामस्थान में केवल एक चर बना सकते हैं:

myglobal = "UGHWTF" 

def main(): 
    global myglobal # prevents creation of a local variable called myglobal 
    myglobal = "yu0 = fail it" 
    anotherfunc() 

def anotherfunc(): 
    print myglobal 

ऐसा नहीं करें।

फ़ंक्शन का पूरा बिंदु यह है कि यह पैरामीटर लेता है। बस अपने कार्यों में पैरामीटर जोड़ें। यदि आपको लगता है कि आपको बहुत से कार्यों को संशोधित करने की आवश्यकता है, तो यह एक संकेत है कि आपको उन्हें कक्षा में एकत्र करना चाहिए।

* विस्तारित करने के लिए यह क्यों संभव नहीं है: पायथन में चर घोषित नहीं किए जाते हैं - जब वे असाइनमेंट कथन निष्पादित होते हैं तो वे बनाए जाते हैं। इसका मतलब है कि निम्नलिखित कोड (astronautlevel द्वारा पोस्ट की गई कोड से प्राप्त) टूट जाएगा:

def setcake(taste): 
    global cake 
    cake = taste 
def caketaste(): 
    print cake #Output is whatever taste was 

caketaste() 

Traceback (most recent call last): 
    File "prog.py", line 7, in <module> 
    caketaste() 
    File "prog.py", line 5, in caketaste 
    print cake #Output is whatever taste was 
NameError: global name 'cake' is not defined 

यह इसलिए होता है क्योंकि जब caketaste कहा जाता है, cake करने के लिए कोई काम नहीं हुआ है। यह केवल setcake के बाद ही होगा। http://ideone.com/HBRN4y

1

आप global बयान उपयोग करने की आवश्यकता:

आप यहाँ त्रुटि देख सकते हैं। ये अपेक्षाकृत सरल हैं। ऐसा करने के लिए, वैरिएबल को परिभाषित करने से पहले एक वैरिएबल को ग्लोबल के रूप में परिभाषित करें। उदाहरण के लिए:

def setcake(taste): 
    global cake 
    cake = taste 
def caketaste(): 
    print cake 
setcake('tasty') 
caketaste() #Output is tasty 

संपादित करें: क्षमा करें, ऐसा लगता है कि मैं अपने प्रश्न पढ़ने में भूलना। मुझे इसे ठीक से जवाब देने का प्रयास करने दें।

def printcake(): 
    print cake #This function prints the taste of cake when called 
def setcake(taste, printq): 
    global cake #This makes sure that cake can be called in any function 
    cake = taste #sets cake's taste 
    if printq: #determines whether to print the taste 
     printcake() 
setcake('good', True) #Calls the function to set cake. Tells it to print result. The output is good 

उत्पादन, कोड के रूप में देखा: http://ideone.com/dkAlEp

+1

को बदल दिया है यदि आप 'सेटकेक' से पहले 'कैकेटस्ट' कहते हैं तो क्या होता है? – Marcin

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