महत्वपूर्ण अंतर
अपरिवर्तनीय (immutable) प्रकारों (int, float, str, tuple) के लिए a += b और a = a + b समान व्यवहार करते हैं। लेकिन **परिवर्तनीय (mutable) प्रकारों** (list, dict, set) के लिए व्यवहार अलग होता है।
केस 1: a = a + b (नया ऑब्जेक्ट बनाता है)
x = 'Hello '
z_list = [1, 2, 3]
try:
z_list = z_list + x # TypeError!
except TypeError as e:
print(f"त्रुटि: {e}")
# can only concatenate list (not "str") to list
केस 2: a += b (इन-प्लेस संशोधन)
z_list = [1, 2, 3] x = 'Hello' z_list += x # इन-प्लेस एक्सटेंड: स्ट्रिंग को इटरेट करके प्रत्येक अक्षर जोड़ता है print(z_list) # [1, 2, 3, 'H', 'e', 'l', 'l', 'o']
क्यों?
a = a + b→a.__add__(b)कॉल करता है, नया ऑब्जेक्ट लौटाता है, फिर असाइन करता है।a += b→ पहलेa.__iadd__(b)(इन-प्लेस एड) कोशिश करता है। सूचियों के लिए__iadd__extend()जैसा व्यवहार करता है (इटरेटबल से प्रत्येक आइटम जोड़ता है)। यदि__iadd__नहीं है, तो__add__पर फॉलबैक करता है।
व्यावहारिक प्रभाव
# रेफरेंस साझाकरण प्रभावित होता है a = [1, 2] b = a a = a + [3] # नई सूची बनाता है print(a, b) # [1, 2, 3] [1, 2] ← b अपरिवर्तित a = [1, 2] b = a a += [3] # इन-प्लेस संशोधन print(a, b) # [1, 2, 3] [1, 2, 3] ← b भी बदल गया!
सारांश
| ऑपरेशन | अपरिवर्तनीय (int, str, tuple) | परिवर्तनीय (list, dict, set) |
|---|---|---|
a = a + b | नया ऑब्जेक्ट | नया ऑब्जेक्ट (यदि समर्थित) |
a += b | नया ऑब्जेक्ट (पुनर्असाइन) | इन-प्लेस संशोधन (यदि __iadd__ परिभाषित है) |
सलाह: परिवर्तनीय ऑब्जेक्ट्स के साथ += का उपयोग करते समय रेफरेंस साझाकरण के प्रति सावधान रहें।