2010-01-18 10 views
14

exec() का उपयोग करके, मैं फ़ंक्शन के अंदर से वैश्विक चर क्यों नहीं बदल सकता? जब यह असाइनमेंट कथन निष्पादन() के बाहर होता है तो यह ठीक काम करता है।निष्पादन() कथन के माध्यम से किसी फ़ंक्शन में वैश्विक चर नहीं बदल सकता है?

 
>>> myvar = 'test' 
>>> def myfunc(): 
...  global myvar 
...  exec('myvar = "changed!"') 
...  print(myvar) 
... 
>>> myfunc() 
test 
>>> print(myvar) 
test 

उत्तर

22

प्रति the docsexec बयान locals() एक में (यदि हो तो) परिवर्तन करता है दो वैकल्पिक भाव लेता है, globals() और locals() को दोषी, और हमेशा की तरह,: यहाँ मेरी समस्या का एक उदाहरण है।

तो, सिर्फ अधिक स्पष्ट/विशिष्ट/सटीक होना ...:

>>> def myfunc(): 
... exec('myvar="boooh!"', globals()) 
... 
>>> myfunc() 
>>> myvar 
'boooh!' 

... और आप अपने दिल की सामग्री के लिए वैश्विक चर मार करने में सक्षम हो जाएगा।

+0

बिल्कुल सही! धन्यवाद, यह बहुत अच्छा काम करता है। :) – linkmaster03

3

इस बारे में कैसे:

>>> myvar = 'test' 
>>> def myfunc(): 
...  exec('globals()["myvar"] = "changed!"') 
...  print(myvar) 
... 
>>> myfunc() 
changed! 
>>> print(myvar) 
changed! 

यह अजगर 2.6 में मेरे लिए काम किया।

संपादित करें: असल में एलेक्स मार्टेली की व्याख्या बहुत बेहतर की तुलना में मेरा :) है

+0

यह मेरे लिए काम करता है (पायथन 3.4.1, विन 8.1) उपरोक्त नहीं था ... – bjd2385

4

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

ए। नेस्टेड स्कोप सेल execed कोड के लिए उपलब्ध नहीं हैं। तो यह विफल रहता है:

def f(): 
    foo= 1 
    def g(): 
     exec('print foo') 
    g() 
f() 

बी। global घोषणाएं execed कोड में नहीं ले जाती हैं। तो डिफ़ॉल्ट रूप से आपके उदाहरण के रूप में, स्थानीय चर शब्दकोश में लिखित चर डाल दिया जाता है। हालांकि, आप इसे

exec('global myvar\nmyvar = "changed!"') 

यदि आप इसकी सहायता कर सकते हैं तो आप वास्तव में ऐसा नहीं करना चाहते हैं। global पहले से ही अच्छा नहीं है और exec अपने आप में बहुत अधिक कोड गंध है! आप उन्हें तब तक गठबंधन नहीं करना चाहते हैं जब तक वास्तव में कोई विकल्प न हो।

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