2012-01-10 11 views
7

यह, पायथन कोड के साथ एक स्थानीय चर बनाने के लिए संभव है, केवल वेरिएबल का नाम (एक स्ट्रिंग) दिया ताकि आगामी कॉल करने के लिए "स्थानीय लोगों में 'xxx'()" यह सच है वापस आ जाएगी?क्या पाइथन में स्थानीय चर बनाने के लिए "गतिशील रूप से" संभव है?

यहाँ एक दृश्य है:

>>> 'iWantAVariableWithThisName' in locals() 
False 
>>> junkVar = 'iWantAVariableWithThisName' 
>>> (...some magical code...) 
>>> 'iWantAVariableWithThisName' in locals() 
True 

क्या उद्देश्य के लिए मैं की आवश्यकता होती है इस प्रवंचना एक अन्य विषय पूरी तरह से है ...

मदद के लिए धन्यवाद।

+0

यह के खिलाफ चेतावनी दी है, लेकिन यह कार्यकारी समारोह का उपयोग कर अजगर 2.x में किया जा सकता है - लेकिन 3.0 में नहीं: http://stackoverflow.com/questions/1450275/modifying-locals-in-python – philofinfinitejest

+3

"किस उद्देश्य के लिए मुझे इस ट्रिकरी की आवश्यकता है पूरी तरह से एक और विषय है ..." - और ** असीम रूप से अधिक महत्वपूर्ण ** है। इस सवाल से पूछें कि आप वास्तव में क्या करना चाहते हैं, इस सवाल से संबंधित नहीं है कि आप कैसे सोचते हैं कि आप इसे करना चाहते हैं। –

+0

कार्ल: कि नीचे एक टिप्पणी में MitchellSalad नोटों वह एक अच्छा विकल्प instead- एक शब्दकोश का उपयोग कर रहा है। –

उत्तर

9

तुम सच में ऐसा करना चाहते हैं हैं, तो आप exec इस्तेमाल कर सकते हैं:

print 'iWantAVariableWithThisName' in locals() 
junkVar = 'iWantAVariableWithThisName' 
exec(junkVar + " = 1") 
print 'iWantAVariableWithThisName' in locals() 
बेशक

, किसी को भी आपको बता कितना खतरनाक और hackish का उपयोग कर कार्यकारी है जाएगा, लेकिन तब तो इनमें से प्रत्येक का कार्यान्वयन किया जाएगा "प्रवंचना।"

+1

हे। हमने भी इसी तरह के वाक्यों का उपयोग किया - यहां तक ​​कि इटालिक्स के उपयोग के लिए भी! - यह इंगित करने के लिए कि ओपी शायद यह नहीं करनी चाहिए। मुझे लगता है कि वहाँ वास्तव में एक स्पष्ट तरीका होना चाहिए करने के लिए (तुम क्यों नहीं करना चाहिए समझाने) इसे .. – DSM

+0

हाँ, पर तुम्हारा कोई नहीं करने के लिए junkVar करता है और मेरा यह 1. बस इतना ही फर्क नहीं पड़ता के लिए सेट करता है। :) +1 तुम्हारा –

+0

लिए यह केवल, अजगर 2 में काम के रूप में यह स्थानीय लोगों के अनुकूलन को निष्क्रिय होगा। * जब आप ऐसा करते हैं तो आपका फ़ंक्शन धीमा हो जाएगा *। यह पायथन 3 में बिल्कुल काम नहीं करेगा। –

6

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

>>> 'iWantAVariableWithThisName' in locals() 
False 
>>> junkVar = 'iWantAVariableWithThisName' 
>>> exec(junkVar + '= None') 
>>> 'iWantAVariableWithThisName' in locals() 
True 
>>> print iWantAVariableWithThisName 
None 

लेकिन तिरानबे एक सौ से बाहर बार आप वास्तव में के बजाय एक शब्दकोश का उपयोग करना चाहते।)

+0

प्रतिक्रिया के लिए धन्यवाद। इस विशिष्ट उदाहरण के लिए, मेरे कोड का उपयोग करने वाले चर नामों की बड़ी संख्या के कारण, निष्पादन कॉल एक शब्दकोश को प्रबंधित करने से बहुत अधिक स्वादिष्ट लग रहा है। क्या आप शायद "कभी-कभी" काम करने वाले निष्पादन के आधार पर थोड़ा और विस्तार कर सकते हैं? संपादित करें: एक शब्दकोश ठीक काम करेगा। विस्तार करने की कोई ज़रूरत नहीं है। :) – MitchellSalad

+0

क्या "कभी-कभी" काम स्थानीय लोगों को अद्यतन कर रहा है, निष्पादन का उपयोग नहीं कर रहा है। उदाहरण के लिए: 'स्थानीय() [" myvar "] = 1'। [डॉक्स] (http://docs.python.org/library/functions.html#locals) कहते हैं: "नोट: इस शब्दकोश की सामग्री को संशोधित नहीं किया जाना चाहिए; परिवर्तन स्थानीय और मुक्त चर के मानों को प्रभावित नहीं कर सकते हैं दुभाषिया द्वारा। " –

+1

@MitchellSalad: नहीं, मेरा मतलब था कि स्थानीय लोगों को अपडेट करना() - यानी स्थानीय() ['जंकवायर'] = 99 - थोड़ा खतरनाक है, और विरोधी अनुशंसित है .. निष्पादन कार्य करना चाहिए, सुरक्षा समस्याओं के बावजूद। मुझे यकीन नहीं है कि मैं आपके स्वाद साझा करता हूं, हालांकि: * अधिक * चर जो मेरे पास थे, उतनी अधिक संभावना है कि मैं उन्हें एक शब्दकोश में लपेटूंगा। – DSM

-1

कार्यकारी उपयोग करने के लिए कोई ज़रूरत नहीं, लेकिन स्थानीय लोगों() [स्ट्रिंग], या वार्स (या वैश्विक() भी काम करते हैं।

test1="Inited" 

if not "test1" in locals(): locals()["test1"] = "Changed" 
if not "test1" in locals(): locals()["test2"] = "Changed" 

print " test1= ",test1,"\n test2=",test2 
+1

इसे एक फ़ंक्शन में आज़माएं और यह काम नहीं करेगा। – pyrospade

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