पायथन में संदर्भ बनाम मूल्य द्वारा पास करें

Pass Reference Vs



पायथन को जानने के बाद, आप ऐसे उदाहरण पा सकते हैं जहां फ़ंक्शन किसी स्थान पर तर्कों को नहीं बदलते हैं जैसा कि आप अनुमान लगाते हैं, खासकर यदि आप कई अन्य कंप्यूटर भाषाओं से परिचित हैं। कई भाषाएं संदर्भ के रूप में विधि तर्कों का उपयोग करती हैं, जिन्हें वर्तमान चर के संदर्भ से गुजरने के रूप में परिभाषित किया गया है। यदि आप एक उन्नत पायथन डेवलपर हैं, जो पायथन के विशेष तरीके से विधि तर्कों के इलाज के तरीके को समझना चाहते हैं, तो यह मार्गदर्शिका वास्तव में आपके लिए है।

पायथन ऑब्जेक्ट रेफरेंस द्वारा पास का समर्थन करता है

पास-बाय-रेफरेंस और पास-बाय-वैल्यू निर्विवाद रूप से प्रोग्रामिंग भाषाओं के बीच पैरामीटर पास करने के दो सबसे अच्छी तरह से पहचाने जाने वाले और आसानी से समझने योग्य तरीके हैं। पायथन, दुख की बात है, 'पास-बाय-ऑब्जेक्ट-रेफरेंस', न तो पास बाय वैल्यू और न ही पास बाय रेफरेंस, जिसे अक्सर कॉल बाय ऑब्जेक्ट रेफरेंस के साथ-साथ कॉल बाय शेयरिंग कहा जाता है। जब आप संदर्भ से गुजरने की तकनीकी बारीकियों में डुबकी लगाते हैं, तो इसे खंडों में विभाजित करके अवधारणा को और अधिक बारीकी से देखना उपयोगी होता है:







उत्तीर्ण: इसका मतलब तर्क के साथ एक विधि की आपूर्ति करना है।



संदर्भ से: इसका मतलब है कि आप जिस तर्क को विधि में ले जाते हैं, वह उस चर को संदर्भित करता है जो अब उस चर की एक अलग प्रतिकृति के बजाय भंडारण में रहता है।



जैसा कि आप विधि को परिभाषित चर के संदर्भ में निर्दिष्ट करते हैं, जिस चर से यह मेल खाता है वह इस संदर्भ पर सभी परिचालनों से स्पष्ट रूप से प्रभावित होगा। आइए अब हम एक उदाहरण पर विचार करें कि व्यवहार में यह कैसे काम करता है। इस उदाहरण में, हमने एक चर परिभाषित किया है ' गुस्सा' का मान होना 4 . इस पूरे परिदृश्य में, चर ' गुस्सा' के स्थान पर संशोधित नहीं किया गया था। पाइथन एक वर्तमान चर के संदर्भ के बजाय स्वयं निहित मान के रूप में आपके प्रदत्त तर्क को संभालने लगता है।





क्या इसका मतलब यह होगा कि संदर्भ के बजाय, पायथन मूल्य के आधार पर तर्कों को आगे बढ़ाता है? पायथन असाइनमेंट के माध्यम से तर्कों को आगे बढ़ाता है, इसलिए न तो संदर्भ द्वारा और न ही मूल्य के साथ। इसके लिए तर्क दो गुना है:



वर्तमान में, गुजरने वाला पैरामीटर किसी वस्तु का सूचक है। कुछ प्रकार के डेटा परिवर्तनशील होते हैं, और कुछ परिवर्तनशील नहीं होते हैं।

यदि हम एक परिवर्तनशील वस्तु को एक फ़ंक्शन में ले जाते हैं, तो फ़ंक्शन उसी ऑब्जेक्ट का संदर्भ प्राप्त करता है ताकि आप इसे अपनी आत्मा की संतुष्टि के लिए बदल सकें; हालांकि, फ़ंक्शन में संदर्भ में फिर से शामिल होने से पहले बाहरी दायरे को कुछ भी नहीं पता होगा। एक बार जब आप समाप्त कर लेंगे, तो बाहरी संदर्भ केवल वास्तविक वस्तु पर लक्षित होगा। यदि आप किसी अपरिवर्तनीय वस्तु को किसी फ़ंक्शन में ले जाते हैं, तो बाहरी संदर्भ को हमेशा पुन: बंधित नहीं किया जा सकता है, और आप ऑब्जेक्ट को केवल उत्परिवर्तित नहीं कर सकते हैं। चीजों को और अधिक सरल बनाने के लिए, आइए एक-एक करके समझते हैं।

संदर्भ द्वारा पास करें

सबसे पहले, आपको यह समझना होगा कि वेरिएबल 'mylist' स्वयं एक सूची नहीं है बल्कि मान वाली सूची को संदर्भित करता है। आप वेरिएबल 'mylist' को एक ऐसा कंटेनर कह सकते हैं, जिसके अंदर मान हों। सूची मान ऑब्जेक्ट हैं। 'माईलिस्ट' वेरिएबल को इसकी सामग्री के साथ सीधे फंक्शन में डिलीवर कर दिया गया है।

सूची और मेरी सूची दोनों नीचे दिए गए कोड उदाहरण में एक ही स्टोरेज वैरिएबल प्रतीत होते हैं और इस प्रकार एक ही स्टोरेज ऑब्जेक्ट पर लागू होते हैं। इसलिए आउटपुट पर यह 'सईद' छापता है।

वेरिएबल या एंटिटी पर की गई कोई भी कार्रवाई तुरंत कॉलर मेथड में दिखाई जाएगी। विधि पूरी तरह से चर के मूल्य को संशोधित कर सकती है और इसे पूरी तरह से अलग वस्तु पर लक्षित कर सकती है। जैसा कि आप 'सेट_लिस्ट' फ़ंक्शन में देख सकते हैं, हमने सूची सामग्री को बदल दिया है और 'अक्सा' तत्व वाली एक पूरी नई सूची मुद्रित की है। ऐसा इसलिए है क्योंकि हमने संशोधित सूची वापस कर दी है और इसे कॉलर के समान ही मुद्रित किया है।

विधि नीचे दिए गए समान परिणाम के लिए चर के तत्वों को फिर से आवंटित कर सकती है। आप देख सकते हैं कि हमने सूची में एक नया मूल्य जोड़ा है, और परिवर्तन परिलक्षित हुआ है। हमने एक सूची में एक अद्वितीय स्ट्रिंग जोड़ दी है और इसे कॉलर को वापस कर दिया है। निष्कर्ष निकालने के लिए, विधि और कॉलर पूरे पास-बाय संबंध में एक ही चर और वस्तु का उपयोग कर रहे हैं।

मूल्य से गुजरें

पास बाय वैल्यू के माध्यम से, विधि को तर्क ऑब्जेक्ट के डुप्लिकेट के साथ आपूर्ति की जाती है जिसे कॉलर इसे असाइन करता है। यह सुनिश्चित करता है कि मूल आइटम अपरिवर्तित रहता है और किए गए सभी संशोधनों को उसी ऑब्जेक्ट की प्रतिकृति में अलग-अलग मेमोरी स्थानों पर बनाए रखा जाता है।

यह विधि द्वारा एक चर या इकाई पर निष्पादित किसी भी संचालन के साथ समान रूप से मान्य है। कॉलर विधि के दायरे में चर और वस्तुओं के डुप्लिकेट को संक्षेप में प्रस्तुत करने के लिए पूरी तरह से अलग किया जाता है।

संदर्भ द्वारा वस्तु पास करें

इस पूरी स्थिति में, चूंकि पायथन अलग है, इसलिए पायथन के तरीके स्टोरेज में बहुत समान ऑब्जेक्ट संदर्भ प्राप्त करते हैं जैसा कि कॉलर संदर्भित करता है। इसके विपरीत, तकनीक चर 'mylist' (कंटेनर) प्राप्त नहीं करती है। कॉलर विधि एक ही वस्तु को संग्रहीत करती है; विधि किसी के कंटेनर को उत्पन्न करती है और पास-बाय-वैल्यू की तरह ही अपने लिए एक पूरी तरह से ताजा सूचकांक उत्पन्न करती है।

कॉलर और विधि भंडारण में एक ही वस्तु की बात करते हैं, लेकिन जब संलग्न विधि किसी बाहरी आइटम को सूची में लागू करती है, तो कॉलर इकाई को संशोधित किया जाता है। उनके पास कई लेबल हैं, लेकिन वे वही चीजें हैं। दोनों चर एक समान वस्तु रखते हैं। वस्तु के द्वारा गति करने के संबंध के पीछे यही भावना है। भंडारण में, विधि और कॉलर एक समान वस्तु का उपयोग करते हैं, फिर भी उन्हें कई चर के माध्यम से पकड़ते हैं। कॉलर वेरिएबल (कंटेनर) को मेथड वेरिएबल (कंटेनर) में किए गए किसी भी संशोधन से नहीं बदला जाएगा; केवल डेटा या सामग्री को संशोधित किया जाता है।

निष्कर्ष

पायथन उन भाषाओं से स्वतंत्र रूप से संचालित होता है जो संदर्भ या तर्कों के मूल्य से चलती को स्वीकार करती हैं। विधि तर्क स्थानीय चर हैं जिन्हें विधि में स्थानांतरित प्रत्येक मान के लिए आवंटित किया गया है। लेकिन यह अभी भी आपको वही परिणाम प्राप्त करने से नहीं रोकता है जो आप प्रॉक्सी द्वारा तर्कों को आगे बढ़ाते हुए अन्य भाषाओं में पाएंगे।