2015-12-18 2 views
6

मैं एक छोटे से फ़ाइल उपयोगिता पहले लिख रहा था बनाए रखने, और संदर्भ द्वारा पारित होने के साथ एक मुद्दा में भाग लिए। How do I pass a variable by reference? पढ़ने के बाद, मैंने वेरिएबल सेट किया जिसे मैं एक तर्क के रूप में और वापसी मूल्य के रूप में पारित करना चाहता था। नीचे दिए गए कोड के भीतर, यह लाइन है:pythonic तरीका चर काम

diff = compareDir(path0, path0List, path1, path1List, diff) 

जहां diff वैरिएबल है जिसे मैं संदर्भ से पास करना चाहता हूं।

हालांकि यह काम करता है, यह नहीं बल्कि अजीब लगता है। मुझे लगता है कि एक बेहतर तरीका होना चाहिए। कई अन्य भाषाओं में, मैं compareLists() को कोई वापसी मूल्य प्राप्त करने के लिए सेट कर सकता हूं, और पास-दर-संदर्भ तर्क को संशोधित करने के दुष्प्रभाव का उपयोग कर सकता हूं। पाइथन के पास-बाय-असाइनमेंट को यह अस्वीकार करना प्रतीत होता है।

मैं अजगर को अपेक्षाकृत नया हूँ, और अगर वहाँ मेरी समस्या का समाधान करने के लिए एक और अधिक pythonic तरीका है पता करना चाहते हैं। क्या इसे पूरी तरह से कार्यों पर पुनर्विचार की आवश्यकता होगी? या क्या कोई अच्छा बयान है जो मुझे अनजान है? मैं वैश्विक चर से दूर रहना चाहता हूं।

मैं किसी भी और सभी रचनात्मक आलोचनाओं और टिप्पणियों का स्वागत करते। धन्यवाद!

प्रासंगिक कोड:

def comparePaths(path0, path1): 
    path0List = os.listdir(path0) 
    path1List = os.listdir(path1) 

    diff = False 
    diff = compareDir(path0, path0List, path1, path1List, diff) 
    print() 
    diff = compareDir(path1, path1List, path0, path0List, diff) 
    return diff 

def compareDir(basePath, baseList, comparePath, compareDir, diffVar): 
    for entry in baseList: 
     #compare to the other folder 
     if (not (entry in compareDir)): 
      if (not (diffVar)): 
       diffVar = True 
       print ("Discreptancies found. The following files are different:") 
       print (str(entry) + " doesn\'t exist in " + str(comparePath)) 
      else: 
       print (str(entry) + " doesn\'t exist in " + str(comparePath)) 
    return diffVar 
+1

यदि आप कुछ ऐसे पैरामीटर को काटना चाहते हैं जहां आप केवल 'तुलनासूची()' कहते हैं, तो मुझे लगता है कि आपको अपने दृष्टिकोण पर पुनर्विचार करने की आवश्यकता हो सकती है। शायद अपने मूल्यों को एक शब्दकोश में संग्रहीत करके क्योंकि आप नामस्थान में कहीं भी कुंजी/मूल्य जोड़े को संशोधित कर सकते हैं। – Dan

+0

धन्यवाद दान, यह एक उत्कृष्ट सुझाव है। मैं बस यही कर सकता हूँ। –

+0

जुड़ा हुआ उत्तर परिवर्तनीय और अपरिवर्तनीय वस्तुओं के बीच भेद को समझाने का एक बिल्कुल अच्छा काम करता है। 'diff = झूठा 'अपरिवर्तनीय है। 'diff = [गलत]' उत्परिवर्तनीय है। – hpaulj

उत्तर

3

अजगर में के बाद से, bool प्रकार अपरिवर्तनीय परिभाषा से है, यह फिर नियत बिना (और एक वैश्विक चर के रूप में यह परिभाषित करने के बिना) एक समारोह के अंदर एक bool चर को संशोधित करने के लिए एक ही रास्ता इसे एक परिवर्तनीय प्रकार के उदाहरण में स्टोर करना है। यानी:

  • इसे एक परिवर्तनीय डेटा संरचना (सूची, निर्देश, ...) में संग्रहीत करना और इस डेटा संरचना को फ़ंक्शन में पास करना।
  • एक परिवर्तनशील वस्तु की एक विशेषता के रूप में यह करने के बाद, और कार्य करने के लिए इस वस्तु गुजरती हैं।
+0

धन्यवाद मंद। आप mutable बनाम अपरिवर्तनीय प्रकार के लिए एक pydocs संदर्भ नहीं होगा? मैंने पाया [mutable बनाम अपरिवर्तनीय अनुक्रमों पर यह संदर्भ] (https://docs.python.org/3.5/reference/datamodel।एचटीएमएल # मानक-प्रकार-पदानुक्रम) लेकिन अधिक जानकारी का उपयोग कर सकते हैं। –

+1

नहीं, लेकिन मुझे लगता है कि सबकुछ वहां है: - संख्यात्मक प्रकार (int, float, complex) अपरिवर्तनीय हैं। - str, बाइट्स और ट्यूपल अपरिवर्तनीय अनुक्रम हैं। - सूची और bytearray mutables हैं। - सेट उत्परिवर्तनीय है, फ्रोजनसेट अपरिवर्तनीय है। - dict mutable है। –

+0

धन्यवाद @ डीआईएम मैं आपकी मदद की सराहना करता हूं। –

2

आपकी समस्या कई संभव समाधान है।

आप अपने diff चर के अंदर अंदरूनी फ़ंक्शन से संशोधित करने के लिए nonlocal संशोधक (global से पहले संशोधक) जोड़ सकते हैं और बाहर से दिखाई देने वाले परिवर्तन हैं।

diff = False 

    def compareDir(basePath, baseList, comparePath, compareDir): 
     nonlocal diff 
     for entry in baseList: 
        ... 
        diff = True 

    compareDir(path0, path0List, path1, path1List) 
    print() 
    compareDir(path1, path1List, path0, path0List) 
    return diff 

या आप differ वस्तु और उस वस्तु की स्पष्ट राज्य के रूप में self.diff साथ OOP समाधान हो सकता है।

class differ(object): 
    def __init__(self): 
     self.diff = False 
    def compareDir(self, basePath, baseList, comparePath, compareDir): 
     ... 
       self.diff = True 
     ... 

    def comparePaths(self, path0, path1): 

लेटर समाधान बहुत उपयोगी है यदि आपको कुछ 'संदर्भ' में बहुत से काम करने की ज़रूरत है और अक्सर साझा स्थिति को बदलने की आवश्यकता होती है।

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