2015-06-20 8 views
13

पायथन सभी वैश्विक चर के शब्दकोश को एक्सेस करने के लिए globals() फ़ंक्शन प्रदान करता है। यह एक समारोह क्यों है और एक चर नहीं है? निम्नलिखित कार्य:पाइथन में ग्लोबल्स() एक फ़ंक्शन क्यों है?

g = globals() 
g["foo"] = "bar" 
print foo # Works and outputs "bar" 

फ़ंक्शन में छिपाने वाले ग्लोबल्स के पीछे तर्क क्या है? और क्या यह केवल एक बार कॉल करना बेहतर है और किसी संदर्भ को कहीं भी स्टोर करना बेहतर है या मुझे इसे हर बार कॉल करने की ज़रूरत है?

IMHO, यह, Reason for globals() in Python? का डुप्लिकेट नहीं है क्योंकि मुझे नहीं पूछ रहा हूँ क्यों globals() मौजूद बल्कि कारण है कि यह एक समारोह (एक चर __globals__ के बजाय) होना चाहिए।

+1

आपको शायद ही कभी डिबगिंग के बाहर ग्लोबल्स तक पहुंचने की आवश्यकता होनी चाहिए, यह संबंधित है http://stackoverflow.com/questions/12693606/reason-for-globals-in-python –

+0

मुझे लगता है कि अगर यह एक चर था, तो यह उपयोगी जगह का उपयोग कर वर्चुअल मेमोरी में संग्रहीत किया जाएगा। एक समारोह होने के नाते, यह आपको उस जानकारी को स्वयं स्टोर करने की अनुमति देता है जब आपको वास्तव में इसकी आवश्यकता होती है (और हमेशा नहीं)। मुझे लगता है कि समारोह जाता है और वैश्विक चर के लिए खोज। तो यदि आप इसे कॉल नहीं करते हैं, तो कोई अतिरिक्त मेमोरी का उपयोग नहीं किया जाता है ... मुझे इस बारे में निश्चित नहीं है, यह सिर्फ मेरी प्रकृति है। – tomasyany

+0

मुझे लगता है कि इस प्रश्न का उत्तर देने के लिए विशिष्ट ऐतिहासिक ज्ञान की आवश्यकता होगी, लेकिन यह देखते हुए कि 'स्थानीय लोगों को एक कार्य होना चाहिए (इसे कॉल करने के दौरान इसे निर्देशित करने की आवश्यकता है), मुझे संदेह है कि' ग्लोबल्स 'को' स्थानीय लोगों 'के साथ समरूपता के लिए एक समारोह बनाया गया था। – user2357112

उत्तर

17

क्योंकि यह पायथन कार्यान्वयन पर निर्भर हो सकता है कि उस शब्दकोश को बनाने के लिए कितना काम है।

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

यह locals() फ़ंक्शन का दर्पण करता है, जिसमें सीपीथॉन में मांग पर एक शब्दकोश बनाना होता है क्योंकि स्थानीय लोगों को आम तौर पर एक सरणी में संग्रहीत किया जाता है (स्थानीय नामों को सीपीथॉन बाइटकोड में सरणी पहुंच में अनुवादित किया जाता है)।

तो आप वैश्विक नामों के मैपिंग तक पहुंच की आवश्यकता होने पर globals() पर कॉल करेंगे। सीपीथॉन में उस मैपिंग कार्यों के संदर्भ को संग्रहीत करना, लेकिन अन्य कार्यान्वयन में इसे अन्य पर भरोसा न करें।

+1

अन्य पायथन कार्यान्वयन का समर्थन कर रहा था जब भी 'ग्लोबल्स' पेश किया गया था? – user2357112

+2

@ user2357112: मुझे ऐसा नहीं लगता है, लेकिन मुझे लगता है कि ग्लोबल्स आंतरिक कार्यान्वयन को धारणाओं से मुक्त रखना महत्वपूर्ण था। –

+0

क्या आपको लगता है कि मैं "ग्लोबल्स() [" foo "] = 'bar'" पर अन्य कार्यान्वयन में काम कर सकता हूं? –

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