2013-02-25 52 views
6

टीएल के लिए पाइथन लोकल(); डीआर: मुझे एक स्थानीय() जो एक दायरे में दिखता है।स्कोप

हाय, सब।

मैं कुछ रसायनज्ञ मित्रों को पाइथन प्रोग्रामिंग पर एक कोर्स पढ़ रहा हूं, और मैं यह सुनिश्चित करना चाहता हूं कि मैं वास्तव में गुंजाइश समझता हूं।

पर विचार करें:

def a(): 
    x = 1 
    def b(): 
     print(locals()) 
     print(globals()) 
    b() 

स्थानीय लोगों का एक खाली पर्यावरण प्रिंट, और वैश्विक सामान्य वैश्विक प्रिंट करता है। मैं उस पर्यावरण तक पहुंच कैसे प्राप्त करूं जहां एक्स संग्रहीत है? स्पष्ट रूप से दुभाषिया इसके बारे में जानता है क्योंकि मैं इसका उल्लेख कर सकता हूं।

संबंधित: स्कोपिंग कब होती है?

def a(): 
    x = 1 
    def b(): 
     a = x+2 
     x = 3 
    b() 

तुम बाहर टिप्पणी यदि x = 3, कोड काम करता है: एक = x + 2 केवल अगर एक्स = 3 शामिल किया गया है पर निम्नलिखित nameErrors। क्या इसका मतलब यह है कि पाइथन इसे समझने से पहले कोड पर एक लेक्सिकल-स्कोप पास बनाता है?

+0

क्या आपको एक सूची चाहिए? क्योंकि आप प्रिंट ग्लोबल्स के बाद प्रिंट एक्स कर सकते हैं। संपादित करें: अगर आप प्रिंट एक्स के साथ एक्स तक पहुंचते हैं तो यह भूलना भूल जाता है कि एक्स: 1 से भरा स्थानीय भी है। –

+0

संभावित डुप्लिकेट [पाइथन में नेमस्पेस कॉल करने से स्थानीय लोगों को प्राप्त करें] (http://stackoverflow.com/questions/6618795/get-locals-from-calling-namespace-in-python) – piokuc

उत्तर

0

कथन print(locals()) निकटतम संलग्नक क्षेत्र को संदर्भित करता है, जो def b(): फ़ंक्शन है। b() पर कॉल करते समय, आप स्थानीय लोगों को इस बी फ़ंक्शन पर प्रिंट करेंगे, और एक्स की परिभाषा दायरे से बाहर है।

def a(): 
    x = 1 
    def b(): 
     print(locals()) 
     print(globals()) 
    b() 
    print(locals()) 

एक्स को स्थानीय चर के रूप में प्रिंट करेगा।

अपने दूसरे प्रश्न के लिए:

def a(): 
    x = 1 
    def b(): 
     #a = x+2 
     x = 3 
    b() 

>>> a() 

कोई त्रुटि देता है।

def a(): 
    x = 1 
    def b(): 
     a = x+2 
     #x = 3 
    b() 

>>> a() 

कोई त्रुटि नहीं देता है।

और

def a(): 
    x = 1 
    def b(): 
     a = x+2 
     x = 3 
    b() 

>>> a() 

निम्नलिखित त्रुटि देता है: UnboundLocalError: local variable 'x' referenced before assignment

IMO (कृपया जाँच), इस तीसरे मामले में, b() की शरीर में पहले बयान सबसे संलग्नित दायरे में एक्स के मूल्य के लिए लग रहा है। और इस दायरे में, एक्स अगली पंक्ति पर असाइन किया गया है। यदि आपके पास केवल a = x+2 है, तो x अधिकांश संलग्नक क्षेत्र में नहीं मिलता है, और x = 1 के साथ 'अगले' संलग्न क्षेत्र में पाया जाता है।

6

क्या अपने कोड में हो रहा है कि जब अजगर को देखने के अपने b() विधि में x=3 लाइन है, यह बजाय b समारोह के भीतर एक क्षेत्र के साथ x पुनः x उपयोग करने के साथ यह a समारोह में गुंजाइश है जाता है।

क्योंकि आपके कोड तो चला जाता है:

a = x+2 
    x = 3 

यह कह रहा है कि आप आंतरिक यह संदर्भित से पहले x scoped परिभाषित करने की जरूरत।

हालांकि, आप b समारोह अजगर के भीतर x के बताए की जरूरत नहीं है जब x scoped एक कम करने के लिए प्रयास नहीं करता है और किसी भी त्रुटि फेंक नहीं होंगे।

निम्नलिखित कोड इस उदाहरण देकर स्पष्ट करना होगा:

def a(): 
    x = 1 
    def b(): 
     x = 3 
     print (x) 

    def c(): 
     print (x) 

    b() 
    c() 
    print (x) 

a() 

लेकिन यदि आप global रूप x घोषित करने के लिए तुम इतनी तरह एक समारोह के भीतर इसे इस्तेमाल कर सकते हैं, इस प्रकार थे:

def a(): 
    global x 
    x = 1 

    def d(): 
     global x 
     x += 2 

    print (x) 
    d() 
    print (x) 

a() 

अजगर 3 भी जोड़ा गया है एक nonlocal कीवर्ड जो आपको एक संलग्न स्कोप से एक चर का उपयोग करने देगा, उपयोग इस प्रकार है:

def a(): 
    x = 1 

    def d(): 
     nonlocal x 
     x += 2 

    print (x) 
    d() 
    print (x) 

a() 

global उदाहरण के समान परिणाम प्रिंट करेगा। Get locals from calling namespace in Python को

जवाब के अनुसार:


मामले में मैं सवाल करने से चूक पढ़ने के

आप का उपयोग कर सकते हैं:

import inspect 

def a(): 
    x = 1 

    def d(): 
     frame = inspect.currentframe() 
     try: 
      print (frame.f_back.f_locals) 
     finally: 
      del frame 
    d() 

a() 

कार्यों का स्थानीय गुंजाइश पाने के लिए फोन करने वाले।

+0

शायद यह ध्यान देने योग्य है कि पायथन 3 ने जोड़ा है एक 'nonlocal' कीवर्ड जिसे आप आंतरिक कार्य में उपयोग कर सकते हैं ताकि मौजूदा नाम को एक संलग्न दायरे से पुनर्निर्मित करने में सक्षम हो सके। – Blckknght

+0

बहुत सेक्सी! धन्यवाद ध्यान देने योग्य मूल्य। – Serdalis