यह पूरी तरह से वस्तु पर निर्भर करता है 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()
सूचियों के मामले में कार्य करता है।