2009-10-19 16 views

उत्तर

17

जब आप कहते हैं कि

global var 

आप अजगर कि वर एक ही वर कि एक वैश्विक संदर्भ में परिभाषित किया गया था है कह रहे हैं। आप निम्नलिखित तरीके से यह प्रयोग करेंगे: वैश्विक बयान के बिना

var=0 
def f(): 
    global var 
    var=1 
f() 
print(var) 
# 1 <---- the var outside the "def f" block is affected by calling f() 

, "डीईएफ़ च" ब्लॉक के अंदर वर एक स्थानीय चर, होगा और इसके मूल्य की स्थापना के बाहर वर पर कोई प्रभाव नहीं होगा "डीफ एफ" ब्लॉक।

var=0 
def f(): 
    var=1 
f() 
print(var) 
# 0 <---- the var outside the "def f" block is unaffected 

जब आप कहते हैं कि globals.update (वर) मैं अनुमान लगा रहा हूँ आप वास्तव में वैश्विक()। अद्यतन (वर) मतलब है। चलिए इसे अलग कर दें।

ग्लोबल्स() एक dict ऑब्जेक्ट देता है। Dict की कुंजी ऑब्जेक्ट्स के नाम हैं, और dict के मान संबंधित ऑब्जेक्ट के मान हैं।

प्रत्येक निर्देश में "अपडेट" नामक एक विधि होती है। तो globals() अद्यतन() इस विधि के लिए एक कॉल है। अद्यतन विधि कम से कम एक तर्क की अपेक्षा करता है, और वह तर्क एक नियम होने की उम्मीद है। आप अजगर

globals().update(var) 

बता तो वर बेहतर एक dict हो गया था, और आप वर dict की सामग्री के साथ वैश्विक अद्यतन करने के लिए अजगर() dict कह रहे हैं।

उदाहरण के लिए:

#!/usr/bin/env python 

# Here is the original globals() dict 
print(globals()) 
# {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__': '/home/unutbu/pybin/test.py', '__doc__': None} 

var={'x':'Howdy'} 
globals().update(var) 

# Now the globals() dict contains both var and 'x' 
print(globals()) 
# {'var': {'x': 'Howdy'}, 'x': 'Howdy', '__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__': '/home/unutbu/pybin/test.py', '__doc__': None} 

# Lo and behold, you've defined x without saying x='Howdy' ! 
print(x) 
Howdy 
+0

ठीक है तो, अगर मैं एक चर एक विधि में घोषणा की, और उस विधि कहा जाता है वैश्विक में() अपडेट ('वर': '0') था। केवल पहली बार चलाने के दौरान लिपि में, मैं 'वैर' का उपयोग उसी वैरिएबल के रूप में नहीं कर पाऊंगा जिसे स्क्रिप्ट के दूसरे निष्पादन पर शेष कोड में "वैश्विक var" के रूप में घोषित किया गया है? – frank

+0

ग्लोबल्स() अद्यतन ('var': '0') ग्लोबल्स() होना चाहिए। अद्यतन ({'var': '0'})। यह वैश्विक चर 'var' को प्रभावित करेगा, भले ही यह आदेश किसी विधि के अंदर रखा गया हो। इन आदेशों का व्यवहार स्क्रिप्ट के प्रत्येक भाग पर समान है। यदि यह आपके प्रश्न का उत्तर नहीं देता है, तो कृपया अपना कोड पोस्ट करें ताकि हम बेहतर समझ सकें। – unutbu

+0

ठीक है, यह कम है, लेकिन स्वरूपण अजीब होगा: कोशिश: \t i + = 1 NameError छोड़कर : \t मैं = 0 । वह कोड मुख्य विधि में होगा, और मैं इसे बदल नहीं सकता, या विधि के कोड/बाहर से पहले कोई विधि घोषणाएं जोड़ सकता हूं। मैं इस छोटे कोड स्निपेट के बाद मुख्य विधि में कोड जोड़ सकता हूं। मुझे वैश्विक चर के रूप में 'मैं' कार्य करने की आवश्यकता है, ताकि यह प्रत्येक क्रमिक स्क्रिप्ट निष्पादन पर '1' से बढ़ेगा। – frank

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