यह पूरी तरह से वस्तु पर निर्भर करता है i।
+=__iadd__विधि को कॉल करता है (यदि यह मौजूद है - यदि यह मौजूद __add__नहीं है तो वापस गिरता है) जबकि विधि 1 या विधि को कुछ मामलों में 2+ कहता है । __add____radd__
एपीआई के नजरिए से, स्थान में__iadd__ उत्परिवर्तित वस्तुओं को संशोधित करने के लिए इस्तेमाल किया जाना चाहिए (जो वस्तु को उत्परिवर्तित किया गया था) जबकि कुछ का नया उदाहरण__add__ वापस करना चाहिए । के लिए अपरिवर्तनीय वस्तुओं, दोनों तरीकों एक नया उदाहरण लौटने के लिए, लेकिन एक ही नाम है कि पुराने उदाहरण था के साथ वर्तमान नाम स्थान में नया उदाहरण डाल देंगे। इसलिए__iadd__
i = 1
i += 1
वेतन वृद्धि लगती है i। वास्तव में, आप एक नया पूर्णांक प्राप्त करते हैं और इसे "शीर्ष पर" असाइन करते हैं i- पुराने पूर्णांक के लिए एक संदर्भ खो देते हैं। इस मामले में, i += 1बिल्कुल वैसा ही है i = i + 1। लेकिन, अधिकांश परिवर्तनशील वस्तुओं के साथ, यह एक अलग कहानी है:
एक ठोस उदाहरण के रूप में:
a = [1, 2, 3]
b = a
b += [1, 2, 3]
print a #[1, 2, 3, 1, 2, 3]
print b #[1, 2, 3, 1, 2, 3]
की तुलना में:
a = [1, 2, 3]
b = a
b = b + [1, 2, 3]
print a #[1, 2, 3]
print b #[1, 2, 3, 1, 2, 3]
नोटिस कैसे पहले उदाहरण में, के बाद से bऔर aसंदर्भ एक ही वस्तु है, जब मैं का उपयोग +=पर b, यह वास्तव में बदल जाता है b(और aभी है कि परिवर्तन देखता है - आखिरकार, यह एक ही सूची को संदर्भित है)। हालांकि, दूसरे मामले में, जब मैं ऐसा करता हूं b = b + [1, 2, 3], तो यह सूची लेती है जो bसंदर्भित है और इसे एक नई सूची के साथ समेटती है [1, 2, 3]। इसके बाद वर्तमान नाम स्थान में समवर्ती सूची को संग्रहीत करता है b- bइससे पहले कि रेखा क्या थी, इसके लिए कोई संबंध नहीं है ।
1 अभिव्यक्ति में x + y, अगर x.__add__लागू नहीं है या यदि x.__add__(y)रिटर्न NotImplemented और xऔर yविभिन्न प्रकार है, तो x + yकॉल करने की कोशिश करता y.__radd__(x)। तो, उस मामले में जहां आपके पास है
foo_instance += bar_instance
यदि Fooलागू नहीं होता है __add__या __iadd__फिर यहां परिणाम समान है
foo_instance = bar_instance.__radd__(bar_instance, foo_instance)
2 अभिव्यक्ति में foo_instance + bar_instance, bar_instance.__radd__पहले की कोशिश की जाएगी foo_instance.__add__ यदि प्रकार के प्रकार का bar_instanceउपवर्ग है foo_instance(जैसे issubclass(Bar, Foo))। इसके लिए तर्कसंगत है क्योंकि Barकुछ अर्थों में एक "उच्च-स्तरीय" वस्तु है, Fooजिससे Barओवरराइडिंग Fooके व्यवहार का विकल्प मिलना चाहिए ।
+=extend()सूचियों के मामले में कार्य करता है।