पायथन द्वारा डिफ़ॉल्ट पैरामीटर मानों को संभालना उन कुछ चीजों में से एक है जो अधिकांश नए पायथन प्रोग्रामर को परेशान कर सकता है।
एक डिफ़ॉल्ट मान के रूप में "म्यूटेबल" ऑब्जेक्ट का उपयोग करने में समस्याएँ क्या होती हैं; यानी, एक मान जिसे सूची या शब्दकोश की तरह संशोधित किया जा सकता है।
यदि कोई दूसरा तर्क प्रदान नहीं किया जाता है, तो हर बार फ़ंक्शन को कॉल करने पर एक नई सूची बनाई जाती है, ताकि अपेक्षित आउटपुट हो:
[12] [43]
फ़ंक्शन परिभाषित होने पर एक बार एक नई सूची बनाई जाती है, और प्रत्येक क्रमिक कॉल में उसी सूची का उपयोग किया जाता है।
फ़ंक्शन परिभाषित होने पर पायथन के डिफ़ॉल्ट तर्कों का मूल्यांकन एक बार किया जाता है, न कि हर बार फ़ंक्शन को कॉल करने पर। इसका मतलब यह है कि यदि आप एक परिवर्तनीय डिफ़ॉल्ट तर्क का उपयोग करते हैं और इसे बदलते हैं, तो आप उस ऑब्जेक्ट को भविष्य में सभी कॉल के लिए फ़ंक्शन में भी बदल देंगे।
हमें क्या करना चाहिए
कोई भी तर्क प्रदान नहीं किया गया था, यह संकेत देने के लिए डिफ़ॉल्ट तर्क का उपयोग करके, फ़ंक्शन को कॉल करने पर हर बार एक नया ऑब्जेक्ट बनाएं (कोई भी अक्सर एक अच्छा विकल्प नहीं होता है)।
उदाहरण
def func(data=[]): data.append(1) return data func() func() def append2(element, foo=None): if foo is None: foo = [] foo.append(element) return foo print(append2(12)) print(append2(43))
आउटपुट
[12] [43]