Saturday, 15 September 2012

python - globals() vs locals() mutability -


पायथन में, ग्लोबल्स () वैश्विक प्रतीक तालिका का एक प्रतिनिधित्व देता है, जबकि स्थानीय () स्थानीय राज्य का एक प्रतिनिधित्व देता है जबकि दोनों एक शब्दकोश लौटते हैं, जबकि ग्लोबल्स () में परिवर्तन वैश्विक प्रतीक तालिका में होते हैं, जबकि स्थानीय लोगों () में कोई प्रभाव नहीं पड़ता।

क्यों यह मामला है?

फ़ंक्शन स्थानीय लोगों को अत्यधिक अनुकूलित और संकलन समय पर निर्धारित किया जाता है, CPython नहीं बनाता है ज्ञात स्थानीय लोगों को रनटाइम पर गतिशील रूप से बदलने में सक्षम है।

फ़ंक्शन बाइटकोक को डीकोड करते समय आप इसे देख सकते हैं:

 > gt; & gt; आयात वि & gt; & gt; & gt; Def foo (): ... a = 'bar' ... एक + 'baz' वापस ... ... & gt; & gt; & gt; Dis.dis (foo) 2 0 LOAD_CONST 1 ('बार') 3 STORE_FAST 0 (ए) 3 6 LOAD_FAST 0 (ए) 9 LOAD_CONST 2 ('बाज़') 12 BINARY_ADD 13 रिटर्न_वॉल   <पी > और ओपरोड वैल्यू लोड और स्टोर करने के लिए  इंडेक्स  का उपयोग करते हैं, क्योंकि किसी फ़्रेम पर स्थानीय लोगों को एक सरणी के रूप में कार्यान्वित किया जाता है। सरणी पर पहुँच एक हैश तालिका (शब्दकोश), जैसे वैश्विक नामस्थान के लिए उपयोग किए जाने की तुलना में तेज़ है।  

स्थानीय () फ़ंक्शन, फ़ंक्शन में उपयोग किए जाने पर, तब एक शब्दकोष के रूप में इस सरणी के प्रतिबिंब देता है लोकल () शब्द बदलने से फिर से उस सरणी में वापस नहीं आ जाएगा।

पायथन 2 में, यदि आप exec का उपयोग करते हैं, तो कोड तो अनुकूलन (आंशिक रूप से) टूटा हुआ है; पायथन उस मामले में धीमा का उपयोग करता है:

  & gt; & gt; & gt; डीफ़ बार (कोड): ... निष्पाद कोड ... वापस एक + 'बाज़' ... ... & gt; & gt; & gt; Dis.dis (बार) 2 0 LOAD_FAST 0 (कोड) 3 LOAD_CONST 0 (कोई नहीं) 6 DUP_TOP 7 EXEC_STMT 3 8 LOAD_NAME 0 (ए) 11 LOAD_CONST 1 ('बाज़') 14 BINARY_ADD 15 रिटर्न_वॉल   

यह भी देखें कि exec () (Py3 में एक फ़ंक्शन) आपको स्थानीय नामों को अब सेट करने की अनुमति नहीं देता है:

स्थानीय लोगों को संशोधित करने के लिए कई परिणामों के बिना मक्खी पर काम संभव नहीं है: आम तौर पर, फ़ंक्शन स्थानीय लोगों को एक शब्दकोश में संग्रहीत नहीं किया जाता है, लेकिन एक सरणी, जिसका सूचकांक ज्ञात लोकेल से समय के संकलन पर निर्धारित होता है। यह कम से कम स्थानीय लोगों के साथ मिलकर चलाता है। पुराने एल्ड कथन ने इस पर खरा उतरा, क्योंकि कंपाइलर जानता था कि यदि कोई फ़ंक्शन बिना ग्लोब / लोकल एजीएल फ़ंक्शन में होता है, तो वह नाम स्थान "अनोपेटिज्ड" होगा, अर्थात स्थानीय एरे का उपयोग नहीं करना। Since exec ( ) अब एक सामान्य कार्य है, संकलक नहीं जानता कि "exec" क्या बाध्य हो सकता है, और इसलिए विशेष रूप से इसका इलाज नहीं कर सकता।


No comments:

Post a Comment