2010-12-14 39 views
10

मैं पता लगाने के लिए किआयात * के बीच और से xxx आयात * अंतर की पुष्टि

import foo 

और

from foo import * 

वैश्विक सदस्यों पर अलग अलग प्रभाव पड़ा आश्चर्य हुआ। मैं पुष्टि करना चाहता था कि मेरे प्रयोग सही व्यवहार हैं।

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

जो व्यवहार मैं चाहता हूं वह सभी फ़ाइलों से foo.x तक पहुंच प्राप्त करना है, इसे सभी फ़ाइलों से बदलने में सक्षम होना चाहिए, और यह परिवर्तन सभी फ़ाइलों में दिखाई देता है (यदि आप चाहते हैं तो एक वास्तविक वैश्विक)।

उत्तर

14

हां, आपके अवलोकन सही हैं। यह पाइथन में बाध्यकारी काम के तरीके का एक परिणाम है।

जब एक करता है

import foo 

तो foo एक वैश्विक नाम मॉड्यूल foo संदर्भ बन जाता है। जब एक

foo.bar = 7 

तो करता संदर्भ पीछा किया जाता है और वस्तु foo भरी हुई है। फिर 7bar विशेषता में संग्रहीत है।

जब कोई अन्य मॉड्यूल foo आयात करता है, तो यह ऑब्जेक्ट को sys.modules['foo'] से बाहर खींचता है और संशोधित मान प्राप्त करता है।

जब एक करता है

from foo import bar 

globals()['bar'] संदर्भ के लिए foo.bar निर्धारित है। जब एक बाद में

bar = 7 

globals()['bar'] करता नहीं रह गया है को संदर्भित foo.bar लेकिन संदर्भ 7 की एक प्रति। यही है, आयात मॉड्यूल के वैश्विक दायरे में मूल बाध्यकारी बस प्रतिस्थापित किया गया है।

मुट्ठी उदाहरण में, कोई उस ऑब्जेक्ट के गुणों को संशोधित कर रहा है जो sys.modules में संग्रहीत है और यह आयात करने वाले सभी मॉड्यूल के लिए आम होगा। दूसरे उदाहरण में, एक आयात मॉड्यूल के वैश्विक दायरे को संशोधित कर रहा है।

एक

from foo import fobaz 
fobaz.foobar = 7 

तब की तर्ज कि परिवर्तन अन्य का आयात मॉड्यूल को प्रचारित किया जाएगा साथ कुछ करने के लिए है क्योंकि एक वैश्विक संदर्भ लेकिन अधिलेखित नहीं यह निम्नलिखित संशोधित करने के लिए है, तो था ऑब्जेक्ट की एक विशेषता जो यह इंगित करती है। इसलिए अनिवार्य रूप से, आप म्यूटेबल ऑब्जेक्ट्स को तब तक संशोधित करने में सक्षम होना चाहिए जब तक कि आप वैश्विक बाध्यकारी को ओवरराइट न करें।

मुझे लगता है कि ऐसा कुछ निकटतम है जिसे आप पाइथन में एक वास्तविक वैश्विक रूप से प्राप्त करने में सक्षम होने जा रहे हैं। एक भाषा के रूप में, यह नामस्थानों को बहुत महत्व देता है।

+0

वाह मुझे यह नहीं पता था। अच्छा उत्तर। – invert

4

ध्यान में रखते हुए कि वैश्विक चर को आम तौर पर एक बुरी चीज माना जाता है, मुझे संदेह है कि "असली वैश्विक" चर एक बहुत ही बुरी चीज होगी।

समान व्यवहार प्राप्त करने का एक अन्य तरीका एक सिंगलटन ऑब्जेक्ट में क्लास-स्कोप विशेषताओं का उपयोग करना है, और बस इसे आयात करें। फिर यह स्पष्ट है कि आपको "वैश्विक" चर मिल रहा है।

+0

यह एक अच्छा मुद्दा है, आपके उत्तर के लिए धन्यवाद। –

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