"संवर्धित" असाइनमेंट ऑपरेटरों की तरह +=
पायथन 2.0 में पेश किए गए थे, जो अक्टूबर 2000 में जारी किया गया था। डिजाइन और औचित्य पीईपी 203 में वर्णित हैं । इन ऑपरेटरों के घोषित लक्ष्यों में से एक इन-प्लेस ऑपरेशन का समर्थन था। लिख रहे हैं
a = [1, 2, 3]
a += [4, 5, 6]
जगह में सूची को अद्यतन करने के लिए माना जाता a
है । यह तब मायने रखता है a
जब सूची के अन्य संदर्भ होते हैं , उदाहरण के लिए जब a
फ़ंक्शन तर्क के रूप में प्राप्त किया गया था।
हालाँकि, ऑपरेशन हमेशा नहीं हो सकता है, क्योंकि कई अजगर प्रकार, जिसमें पूर्णांक और तार शामिल हैं, अपरिवर्तनीय हैं , इसलिए i += 1
एक पूर्णांक के लिए जैसेi
संभवतः जगह में काम नहीं कर सकता है।
सारांश में, संवर्धित असाइनमेंट ऑपरेटरों को संभव होने पर काम करना चाहिए, और अन्यथा एक नई वस्तु तैयार करनी चाहिए। इन डिजाइन लक्ष्यों को सुविधाजनक बनाने के लिए, अभिव्यक्तिx += y
को निम्नानुसार व्यवहार करने के लिए निर्दिष्ट किया गया था:
- अगर
x.__iadd__
परिभाषित किया गया है, x.__iadd__(y)
तो मूल्यांकन किया जाता है।
- अन्यथा, यदि
x.__add__
लागू किया x.__add__(y)
जाता है तो मूल्यांकन किया जाता है।
- अन्यथा, यदि
y.__radd__
लागू किया y.__radd__(x)
जाता है तो मूल्यांकन किया जाता है।
- अन्यथा एक त्रुटि बढ़ा।
इस प्रक्रिया द्वारा प्राप्त पहला परिणाम वापस सौंपा जाएगा x
(जब तक कि यह परिणाम NotImplemented
सिंगलटन न हो, जिस स्थिति में अगले चरण के साथ लुकअप जारी रहता है)।
यह प्रक्रिया उन प्रकारों को अनुमति देती है जो लागू करने के लिए इन-प्लेस संशोधन का समर्थन करते हैं __iadd__()
। इन-प्लेस संशोधन का समर्थन नहीं करने वाले प्रकारों को किसी नए जादू के तरीकों को जोड़ने की आवश्यकता नहीं है, क्योंकि पायथन स्वचालित रूप से अनिवार्य रूप से वापस आ जाएगाx = x + y
।
तो चलिए अंत में आपके वास्तविक प्रश्न पर आते हैं - आप एक संवर्धित असाइनमेंट ऑपरेटर के साथ सूची में टपल को क्यों जोड़ सकते हैं। स्मृति से, इस का इतिहास लगभग इसी तरह था: पायथन 2.0 में list.__iadd__()
पहले से मौजूद list.extend()
विधि को कॉल करने के लिए यह विधि लागू की गई थी । जब पायथन 2.1 में पुनरावृत्तियों को पेश किया list.extend()
गया था , तो विधि को पुनरावृत्तियों को स्वीकार करने के लिए अद्यतन किया गया था। इन परिवर्तनों का अंतिम परिणाम यही थाmy_list += my_tuple
पायथन 2.1 से काम करना शुरू किया। list.__add__()
विधि, तथापि, दाएँ हाथ के तर्क के रूप में मनमाने ढंग से iterators का समर्थन करने वाला कभी नहीं था - यह एक जोरदार टाइप किया भाषा के लिए अनुपयुक्त माना जाता था।
मुझे व्यक्तिगत रूप से लगता है कि संवर्धित परिचालकों का कार्यान्वयन पायथन में थोड़ा बहुत जटिल हो गया था। इसके कई आश्चर्यजनक दुष्प्रभाव हैं, जैसे यह कोड:
t = ([42], [43])
t[0] += [44]
दूसरी पंक्ति उठती है TypeError: 'tuple' object does not support item assignment
, लेकिन ऑपरेशन सफलतापूर्वक वैसे भी किया जाता है - त्रुटि को उठाने वाली रेखा को निष्पादित करने के बाद t
होगा ([42, 44], [43])
।