2010-03-01 12 views
7

मैं वर्तमान में पाइथन में कुछ चीजें विकसित कर रहा हूं और मेरे पास चर के दायरे के बारे में एक प्रश्न है।परिवर्तनीय दायरे के बारे में सुधार

a = None 
anything = False 
if anything: 
    a = 1 
else: 
    a = 2 

print a # prints 2 

अगर मैं पहली पंक्ति को दूर (एक = कोई नहीं) कोड अभी भी पहले की काम करता है:

इस कोड है। हालांकि इस मामले में मैं चर को "अगर" ब्लॉक के अंदर घोषित कर दूंगा, और जावा जैसी अन्य भाषाओं के बारे में, यह चर केवल "अगर" के अंदर दिखाई देगा।

पाइथन में वास्तव में परिवर्तनीय स्कॉपिंग कैसे काम करती है और इस तरह के मामलों में प्रोग्राम करने का अच्छा तरीका क्या है?

धन्यवाद!

+2

पाइथन में एक चर "घोषित" जैसी कोई चीज़ नहीं है! –

उत्तर

8

अंगूठे का एक नियम के रूप में, स्कोप तीन स्थानों पर बनाई गई हैं:

  1. फ़ाइल-गुंजाइश - class ब्लॉक
  2. समारोह दायरे के अंदर बनाया - अन्यथा मॉड्यूल गुंजाइश के रूप में
  3. वर्ग दायरे में जाना जाता है - def ब्लॉक

अंदर बनाया (इन करने के लिए कुछ अपवाद हैं।)

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

+1

वास्तव में चार स्थान हैं, चौथा वैश्विक स्तर है। लेकिन यह वास्तव में इस बात पर निर्भर करता है कि क्या आप वैश्विक रूप से अपने आप में एक दायरा मानते हैं। – jathanism

+1

जहां तक ​​मैं वैश्विक दायरे को समझता हूं, यह आमतौर पर फ़ाइल/मॉड्यूल स्कोप का पर्याय बनता है। जिन अपवादों के बारे में मुझे पता है उनमें ग्लोबल्स के लिए 'निष्पादन' या 'eval' में एक शब्दकोश को पास करना शामिल है। स्मृति से, चौथा दायरा जनरेटर अभिव्यक्तियों में पाया जाता है, इटेटरेटर चर से बचने की इजाजत नहीं देता है। और पांचवां बंद होने के लिए गैर-स्थानीय ब्लॉक गुंजाइश है - मुझे इसे समझाने का कोई आसान तरीका कभी नहीं मिला है। –

+0

+1 अच्छा जवाब। –

2

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

ध्यान दें कि जब आप बाहरी कार्यों में घोषित चरों तक पहुंच सकते हैं - दूसरे शब्दों में, पायथन बंद हो जाता है।

def adder(first): 
    def add(second): 
     return first + second 

    return add 

यह योजक नामक फ़ंक्शन को परिभाषित करता है। जब first पर तर्क के साथ बुलाया जाता है, तो यह एक फ़ंक्शन लौटाएगा जो first पर जो भी तर्क प्राप्त करता है उसे जोड़ देगा और उस मान को वापस कर देगा। उदाहरण के लिए:

add_two = adder(2) 
add_three = adder(3) 
add_two(4) # = 6 
add_three(4) # = 7 

भले ही आप बाहरी समारोह से मूल्य पढ़ सकते हैं, आप इसे (कई अन्य भाषाओं में विपरीत) बदल नहीं सकते। उदाहरण के लिए, एक संचयक को लागू करने की कोशिश की कल्पना करें। तुम इतनी तरह कोड लिख सकते हैं:

def accumulator(): 
    total = 0 
    def add(number): 
     total += number 
     return total 
    return add 

दुर्भाग्य से, एक त्रुटि संदेश में इस कोड के परिणाम का उपयोग करने की कोशिश कर:

UnboundLocalError: local variable 'total' referenced before assignment 

इसका कारण यह है लाइन total += number की कोशिश करता है total के मूल्य बदलने के लिए जो नहीं कर सकते पायथन में इस तरह से किया जाना चाहिए।

+0

आप 'nonlocal' (पायथन 3 में नया) का उपयोग करके अपने' accumulator() 'उदाहरण में जो कुछ चाहिए उसे कर सकते हैं। –

0

पायथन को प्रारंभ में घोषित करने के लिए चर की आवश्यकता नहीं है, इसलिए आप मनमानी बिंदुओं को घोषित और परिभाषित कर सकते हैं। और हां, दायरा कार्यक्षेत्र है, इसलिए यह if के बाहर दिखाई देगा।

1

if ब्लॉक में चर निर्दिष्ट करने में कोई समस्या नहीं है।

इस मामले में इसे दोनों शाखाओं पर असाइन किया जा रहा है, ताकि आप इसे प्रिंट कर सकें, इसे निश्चित रूप से परिभाषित किया जाएगा।

शाखाओं में से एक a को आवंटित नहीं किया है तो एक NameError अपवाद अजगर में, बढ़ा दिया जाएगा जब आप उस शाखा

0

मैं कर रहा हूँ काफी अभी शुरुआत प्रोग्रामर के बाद इसे प्रिंट करने का प्रयास करें, लेकिन मैं क्या पता के लिए निजी चर मौजूद नहीं है। एक विस्तृत चर्चा के लिए पाइथन दस्तावेज में private variables देखें।

उपयोगी जानकारी उसी पृष्ठ पर "स्कॉप्स और नेमस्पेस" अनुभाग में भी मिल सकती है।

व्यक्तिगत रूप से, मैं एक आप काफी हर दिन तैनात है, खासकर जब हालत

if len(sys.argv)==2: 
    f = open(sys.argv[1], 'r') 
else: 
    print ('provide input file') 

मैं चर घोषित कर उन्हें संरचित प्रकार के लिए उपयोग करने से पहले उदाहरण के लिए, उपयोगकर्ता से इनपुट प्राप्त करने में निर्भर करता है की तरह कोड लिखने उदाहरण के लिए, मैं लूप के भीतर अपनी वस्तुओं को जोड़ने से पहले एक खाली सूची घोषित करता हूं।

उम्मीद है कि यह मदद करता है।

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