python tutorial रिक्त सूची वाले डिफ़ॉल्ट पैरामीटर से बचने का अजगर तरीका क्या है?




python tutorial (5)

कभी-कभी यह एक सामान्य पैरामीटर वाला प्राकृतिक लगता है जो एक खाली सूची है। फिर भी अजगर इन स्थितियों में अप्रत्याशित व्यवहार प्रदान करता है।

उदाहरण के लिए, मेरे पास एक फ़ंक्शन है:

def myFunc(working_list = []):
    working_list.append("a")
    print working_list

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

तो, मैं इच्छा के व्यवहार को पाने के लिए अजगर का तरीका क्या है (प्रत्येक कॉल पर एक ताजा सूची)?


पहले से ही अच्छे और सही उत्तर दिए गए हैं। मैं सिर्फ एक और सिंटैक्स को लिखना चाहता था कि आप क्या करना चाहते हैं जो मुझे अधिक सुंदर लगता है जब आप उदाहरण के लिए डिफ़ॉल्ट खाली सूचियों वाले वर्ग बनाना चाहते हैं:

class Node(object):
    def __init__(self, _id, val, parents=None, children=None):
        self.id = _id
        self.val = val
        self.parents = parents if parents is not None else []
        self.children = children if children is not None else []

यह स्निपेट अगर else ऑपरेटर सिंटैक्स का उपयोग करता है मुझे यह विशेष रूप से पसंद है क्योंकि यह एक बहुत कम एक-लाइनर बिना बृहदान्त्र आदि शामिल है और यह लगभग सामान्य अंग्रेज़ी वाक्य की तरह पढ़ता है। :)

आपके मामले में आप लिख सकते हैं

def myFunc(working_list=None):
    working_list = [] if working_list is None else working_list
    working_list.append("a")
    print working_list

ऐसा नहीं है कि यह इस मामले में महत्वपूर्ण है, लेकिन आप किसी के लिए परीक्षण करने के लिए वस्तु पहचान का उपयोग कर सकते हैं:

if working_list is None: working_list = []

आप का फायदा भी उठा सकते हैं कि कैसे बुलियन ऑपरेटर या अजगर में परिभाषित किया गया है:

working_list = working_list or []

यद्यपि यह अप्रत्याशित रूप से व्यवहार करेगा यदि कॉलर आपको कार्य सूची के रूप में खाली सूची (जो कि झूठी के रूप में गिना जाता है) देता है और आपके फ़ंक्शन को उस सूची को संशोधित करने की उम्मीद करता है जिसने उसने इसे दिया था।


def myFunc(working_list=None):
    if working_list is None: 
        working_list = []
    working_list.append("a")
    print working_list

मैं इसे कैसे करता हूं


मौजूदा उत्तर में पहले से ही सीधे समाधान दिए गए हैं जैसा कि पूछा गया है। हालांकि, चूंकि यह नया पायथन प्रोग्रामर के लिए एक बहुत ही सामान्य खतरा है, यह स्पष्टीकरण जोड़ने के लिए लायक है कि अजगर इस तरह से कैसे व्यवहार करता है, जिसे " हिचहाइर्स गाइड टू पायथन " में संक्षेप में " परिवर्तन योग्य डिफ़ॉल्ट तर्क " के रूप में सारांशित किया गया है : http: // docs .python-guide.org / en / नवीनतम / लेखन / gotchas /

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

इसे लागू करने के लिए नमूना कोड:

def foo(element, to=None):
    if to is None:
        to = []
    to.append(element)
    return to

मैं ऑफ-विषय हो सकता है, लेकिन याद रखना चाहिए कि यदि आप सिर्फ तर्कों की एक चर संख्या पारित करना चाहते हैं, तो **kargs एक ट्यूपल *args **kargs या शब्दकोश **kargs । ये वैकल्पिक हैं और सिंटैक्स myFunc([1, 2, 3])

यदि आप टुपल को पास करना चाहते हैं:

def myFunc(arg1, *args):
  print args
  w = []
  w += args
  print w
>>>myFunc(1, 2, 3, 4, 5, 6, 7)
(2, 3, 4, 5, 6, 7)
[2, 3, 4, 5, 6, 7]

यदि आप एक शब्दकोश पास करना चाहते हैं:

def myFunc(arg1, **kargs):
   print kargs
>>>myFunc(1, option1=2, option2=3)
{'option2' : 2, 'option1' : 3}




python