यदि आप दूसरी भाषा से अजगर के पास आ रहे हैं (एक को छोड़कर, जो कि अजगर की तरह है, जैसे रूबी), और इसे उस दूसरी भाषा के संदर्भ में समझने पर जोर देते हैं, तो यहां लोग आमतौर पर भ्रमित होते हैं:
>>> a = 1
>>> a = 2 # I thought int was immutable, but I just changed it?!
पायथन में, पायथन में असाइनमेंट म्यूटेशन नहीं है।
C ++ में, यदि आप लिखते हैं a = 2
, तो आप कॉल कर रहे हैं a.operator=(2)
, जो संग्रहित ऑब्जेक्ट को म्यूट करेगा a
। (और अगर वहाँ कोई वस्तु संग्रहीत नहीं थीa
, तो यह एक त्रुटि है।)
पायथन में, a = 2
जो कुछ भी संग्रहीत किया गया था , उसके लिए कुछ भी नहीं करता है a
; इसका मतलब सिर्फ इतना है कि 2
अब a
इसके बजाय संग्रहीत किया जाता है। (और अगर वहाँ कोई वस्तु संग्रहीत नहीं थीa
, तो यह ठीक है।)
अंततः, यह एक और भी गहरे अंतर का हिस्सा है।
C ++ जैसी भाषा में एक चर स्मृति में एक टाइप किया गया स्थान है। यदि a
कोई है int
, तो इसका मतलब यह है कि यह 4 बाइट्स है जो कंपाइलर जानता है कि इसकी व्याख्या की जानी चाहिए int
। इसलिए, जब आप ऐसा करते हैं a = 2
, तो यह बदल जाता है कि मेमोरी के उन 4 बाइट्स में क्या संग्रहीत किया 0, 0, 0, 1
जाता है 0, 0, 0, 2
। यदि कहीं और एक अन्य चर है, तो इसकी अपनी 4 बाइट्स हैं।
पायथन जैसी भाषा में एक चर एक वस्तु का एक नाम है जिसका अपना जीवन है। संख्या के लिए एक वस्तु है 1
, और संख्या के लिए दूसरी वस्तु है 2
। और a
स्मृति के 4 बाइट्स नहीं हैं जिन्हें एक के रूप में दर्शाया गया है int
, यह सिर्फ एक नाम है जो 1
ऑब्जेक्ट पर इंगित करता है। यह a = 2
संख्या 2 को नंबर 2 में बदलने के लिए कोई मतलब नहीं है (जो किसी भी पायथन प्रोग्रामर को ब्रह्मांड के मौलिक कामकाज को बदलने के लिए बहुत अधिक शक्ति देगा); इसके बजाय यह क्या करता है बस वस्तु को a
भूल जाओ 1
और 2
इसके बजाय वस्तु को इंगित करो ।
इसलिए, यदि असाइनमेंट म्यूटेशन नहीं है, तो म्यूटेशन क्या है ?
- एक ऐसी विधि को कॉल करना जो म्यूट करने के लिए प्रलेखित है, जैसे
a.append(b)
। (ध्यान दें कि ये विधियाँ लगभग हमेशा लौटती हैं None
)। अपरिवर्तनीय प्रकारों में ऐसी कोई विधियाँ नहीं होती हैं, जो परिवर्तनशील प्रकार आमतौर पर होती हैं।
- वस्तु के एक भाग को निर्दिष्ट करना, जैसे
a.spam = b
या a[0] = b
। अपरिवर्तनीय प्रकार विशेषता या तत्वों को असाइन करने की अनुमति नहीं देते हैं, परिवर्तनशील प्रकार आमतौर पर एक या दूसरे को अनुमति देते हैं।
- कभी-कभी संवर्धित असाइनमेंट का उपयोग करना, जैसे
a += b
, कभी-कभी नहीं। म्यूटेबल प्रकार आमतौर पर मूल्य को उत्परिवर्तित करते हैं; अपरिवर्तनीय प्रकार कभी नहीं करते हैं, और आपको इसके बजाय एक प्रति देते हैं (वे गणना करते हैं a + b
, फिर परिणाम असाइन करें a
)।
लेकिन अगर असाइनमेंट म्यूटेशन नहीं है, तो ऑब्जेक्ट म्यूटेशन के हिस्से को कैसे असाइन किया जा रहा है? बस यहीं से मुश्किल हो जाती है। म्यूट नहींa[0] = b
करता है (फिर से, सी ++ के विपरीत), लेकिन यह म्यूटेट करता है (सी ++ के विपरीत, अप्रत्यक्ष रूप से छोड़कर)।a[0]
a
यह सब इसीलिए संभव है कि आप जिस भाषा के लिए अभ्यस्त हैं , उसके संदर्भ में पाइथन के शब्दार्थ को डालने की कोशिश न करें, और इसके बजाय अपनी शर्तों पर पाइथन के शब्दार्थ को जानें।