पायथन का डिफ़ॉल्ट पैरामीटर मानों को संभालना उन कुछ चीज़ों में से एक है जो अक्सर नए पायथन प्रोग्रामर्स को परेशान करती है।
समस्या तब होती है जब एक "म्यूटेबल" (परिवर्तनीय) ऑब्जेक्ट को डिफ़ॉल्ट मान के रूप में उपयोग किया जाता है; यानी एक ऐसा मान जिसे स्थानांतरित करके संशोधित किया जा सकता है, जैसे सूची या डिक्शनरी।
समस्या
यदि कोई दूसरा आर्गुमेंट प्रदान नहीं किया जाता है, तो हर बार फंक्शन कॉल होने पर एक नई सूची बनती है, जिससे अपेक्षित आउटपुट मिलता है:
[12] [43]
लेकिन अगर म्यूटेबल डिफ़ॉल्ट आर्गुमेंट का उपयोग किया जाए, तो एक ही सूची हर कॉल में साझा होती है, क्योंकि पायथन डिफ़ॉल्ट आर्गुमेंट्स का मूल्यांकन केवल एक बार करता है जब फंक्शन परिभाषित होता है, हर कॉल पर नहीं।
समाधान
हर बार फंक्शन कॉल होने पर एक नया ऑब्जेक्ट बनाएं, डिफ़ॉल्ट आर्गुमेंट के रूप में None का उपयोग करके यह संकेत दें कि कोई आर्गुमेंट प्रदान नहीं किया गया था।
उदाहरण
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]