यह मूल प्रश्न (जो मुझे लगता है कि पर्याप्त रूप से उत्तर दिया गया है) का उत्तर नहीं है, लेकिन संवर्धित असाइनमेंट (+=
और इसी तरह के संचालन) के अर्थशास्त्र के बारे में टिप्पणियों में पूछे गए कई प्रश्नों के लिए।
संक्षेप में: अपरिवर्तित असाइनमेंट अपरिवर्तनीय लोगों की तुलना में परिवर्तनीय प्रकारों के लिए अलग-अलग काम करता है।
str
, tuple
, और संख्यात्मक प्रकार, दूसरों के बीच, अपरिवर्तनीय हैं। एक बार यह बनाया गया है एक टपल की सामग्री को बदला नहीं जा सकता है, तो आप इस व्यवहार मिलता है:
>>> a = (1, 2)
>>> b = a
>>> a += (3, 4)
>>> a
(1, 2, 3, 4)
>>> b
(1, 2)
str
एक ही अर्थ विज्ञान है। असल में, a = a + b
के बराबर है यदि a
अपरिवर्तनीय है।
list
समेत अधिकांश अन्य प्रकार, परिवर्तनीय हैं।एक सूची की सामग्री जगह में बदला जा सकता है, और संवर्द्धित असाइनमेंट वास्तव में ऐसा करता है। इसलिए:
>>> a = [1, 2]
>>> b = a
>>> a += [3, 4]
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
जबकि यदि तीसरी लाइन a = a + [3, 4]
ने प्रतिस्थापित किया, एक नई सूची बनाई जाएगी और b
[1, 2]
होगा।
उपयोगकर्ता-निर्धारित कक्षा के लिए, अर्थ विज्ञान है कि यह कैसे लागू किया गया था पर निर्भर करते हैं, लेकिन यह है कि यह कैसे पीईपी 203
प्रति किया जाना चाहिए था इस व्यवहार अभी भी अजगर 3.x में मौजूद है है? मुझे हमेशा यह परेशान लगता है कि एक मानक लाइब्रेरी प्रकार सामान्य अनुबंध को तोड़ता है जो 'ए + = बी' <=>' ए = ए + बी' (मूल 'ए' मान के किसी भी अन्य संदर्भ को प्रभावित किए बिना)। –
@ करल कंचटेल: दुर्भाग्यवश, यह अभी भी पायथन 3.2.1 में मौजूद है। –
मैं इसे पायथन 3.2 में देख रहा था, हां। मुझे इस मुद्दे को एक शुरुआती कोड की तलाश में मिला जो गलत परिणाम दे रहा था। मुझे 'सीखने पायथन' में इस विशिष्ट व्यवहार का कोई संदर्भ नहीं मिला। मैंने पीईपी 203 की जांच की और कहा कि '__iadd__' का उपयोग किया जाता है लेकिन वे यह भी कहते हैं कि' __iadd__' जगह '__add__' है जो इस मामले में नहीं है ... शायद कोई इस व्यवहार या बिंदु/लिंक के नीचे तर्कसंगत समझा सकता है इसके बारे में कुछ चर्चा करने के लिए? मैं कार्ल की टिप्पणी से समझता हूं कि इसके बारे में लोग चिंतित हैं – joaquin