परिचय: पायथन वेरिएबल पासिंग की खोज
पायथन में, जिस तरह से वेरिएबल को फ़ंक्शन में पास किया जाता है वह कभी-कभी भ्रमित करने वाला हो सकता है, खासकर जब पास-बाय-रेफरेंस और पास-बाय-वैल्यू की अवधारणाओं को समझने की कोशिश की जाती है। यह भ्रम अक्सर उन परिदृश्यों में उजागर होता है जहां डेवलपर्स फ़ंक्शन के भीतर एक वेरिएबल में परिवर्तन को फ़ंक्शन के बाहर भी प्रतिबिंबित करने की अपेक्षा करते हैं।
इसे स्पष्ट करने के लिए, एक वर्ग पर विचार करें जहां एक विधि के अंदर एक चर को संशोधित किया जाता है। पायथन वैरिएबल पासिंग को कैसे संभालता है, इसके कारण अपेक्षित परिणाम हमेशा वास्तविक परिणाम से मेल नहीं खा सकता है। यह आलेख इस व्यवहार के पीछे की यांत्रिकी पर प्रकाश डालता है और पायथन में पास-बाय-रेफरेंस प्रभाव प्राप्त करने पर अंतर्दृष्टि प्रदान करता है।
आज्ञा | विवरण |
---|---|
self.variable = ['Original'] | एकल स्ट्रिंग तत्व के साथ एक परिवर्तनशील सूची प्रारंभ करता है। |
var[0] = 'Changed' | विधि को पारित सूची के पहले तत्व को परिवर्तित करता है। |
class Wrapper: | किसी मान को समाहित करने के लिए एक वर्ग को परिभाषित करता है, जिससे पास-बाय-संदर्भ-जैसे व्यवहार की अनुमति मिलती है। |
self.value = value | रैपर वर्ग के भीतर लपेटे गए मान को प्रारंभ करता है। |
var.value = 'Changed' | विधि को पारित रैपर इंस्टेंस की मान विशेषता को संशोधित करता है। |
self.variable = {'key': 'Original'} | एकल कुंजी-मूल्य जोड़ी के साथ एक परिवर्तनशील शब्दकोश आरंभ करता है। |
var['key'] = 'Changed' | विधि को पारित शब्दकोश में कुंजी से जुड़े मान को बदलता है। |
पायथन में पास-बाय-रेफरेंस लागू करना
पहली स्क्रिप्ट पायथन में पास-बाय-रेफरेंस के प्रभाव को प्राप्त करने के लिए एक परिवर्तनीय सूची का उपयोग करती है। कक्षा में PassByReference, परिवर्तनशील self.variable एकल स्ट्रिंग तत्व 'मूल' वाली सूची के रूप में प्रारंभ किया गया है। प्रक्रिया self.change(self.variable) इस सूची को विधि में पास करके कॉल किया जाता है। विधि के अंदर, आदेश var[0] = 'Changed' सूची के पहले तत्व को संशोधित करता है। क्योंकि सूचियाँ परिवर्तनशील हैं, यह परिवर्तन विधि के बाहर परिलक्षित होता है, जिसके परिणामस्वरूप आउटपुट 'परिवर्तित' होता है। यह स्क्रिप्ट दर्शाती है कि सूचियों जैसे परिवर्तनशील प्रकारों का उपयोग करके पास-दर-संदर्भ व्यवहार का अनुकरण कैसे किया जा सकता है।
दूसरी स्क्रिप्ट एक परिचय देती है Wrapper क्लास एक मान को एनकैप्सुलेट करने के लिए, पास-बाय-रेफरेंस-जैसी कार्यक्षमता की अनुमति देता है। में PassByReference वर्ग, चर self.variable के एक उदाहरण के साथ प्रारंभ किया गया है Wrapper 'मूल' युक्त. प्रक्रिया self.change(self.variable) कहा जाता है, पारित करना Wrapper उदाहरण। विधि के अंदर, आदेश var.value = 'Changed' को संशोधित करता है value की विशेषता Wrapper उदाहरण। यह परिवर्तन विधि के बाहर परिलक्षित होता है, जिसके परिणामस्वरूप आउटपुट 'परिवर्तित' होता है। यह दृष्टिकोण दर्शाता है कि कैसे एक कस्टम रैपर क्लास बनाने से पास-बाय-रेफरेंस के समान प्रभाव प्राप्त हो सकते हैं।
म्यूटेबल स्टेट पासिंग के लिए शब्दकोशों का उपयोग करना
तीसरी स्क्रिप्ट पास-बाय-रेफरेंस के प्रभाव को प्राप्त करने के लिए एक शब्दकोश का उपयोग करती है। में PassByReference वर्ग, चर self.variable एकल कुंजी-मूल्य जोड़ी {'कुंजी': 'मूल'} के साथ एक शब्दकोश के रूप में प्रारंभ किया गया है। प्रक्रिया self.change(self.variable) इस शब्दकोश को विधि में पास करते हुए कहा जाता है। विधि के अंदर, आदेश var['key'] = 'Changed' शब्दकोश में कुंजी से जुड़े मान को संशोधित करता है। चूँकि शब्दकोश परिवर्तनशील हैं, यह परिवर्तन विधि के बाहर परिलक्षित होता है, जिसके परिणामस्वरूप आउटपुट 'परिवर्तित' होता है। यह स्क्रिप्ट इस बात पर प्रकाश डालती है कि कैसे शब्दकोशों जैसे परिवर्तनशील प्रकारों का उपयोग करके पास-दर-संदर्भ व्यवहार का अनुकरण किया जा सकता है।
कुल मिलाकर, ये उदाहरण पायथन में पास-बाय-रेफरेंस अनुकरण के विभिन्न तरीकों को दर्शाते हैं। सूचियों और शब्दकोशों जैसे परिवर्तनशील प्रकारों का उपयोग करके या कस्टम रैपर क्लास को कार्यान्वित करके, वांछित प्रभाव प्राप्त करना संभव है जहां फ़ंक्शन के भीतर एक चर में परिवर्तन फ़ंक्शन के बाहर परिलक्षित होते हैं। इन तकनीकों को समझना उन डेवलपर्स के लिए महत्वपूर्ण है जो अपने पायथन कार्यक्रमों के भीतर चर को अधिक प्रभावी ढंग से हेरफेर करना चाहते हैं।
पास-दर-संदर्भ की नकल करने के लिए किसी वस्तु की विशेषता को संशोधित करना
पायथन: पास-बाय-रेफरेंस को अनुकरण करने के लिए परिवर्तनीय प्रकारों का उपयोग करना
class PassByReference:
def __init__(self):
self.variable = ['Original']
self.change(self.variable)
print(self.variable[0])
def change(self, var):
var[0] = 'Changed'
pbr = PassByReference()
पास-बाय-रेफरेंस प्रभाव प्राप्त करने के लिए रैपर क्लास का उपयोग करना
पायथन: म्यूटेबल स्टेट के लिए एक रैपर क्लास लागू करना
class Wrapper:
def __init__(self, value):
self.value = value
class PassByReference:
def __init__(self):
self.variable = Wrapper('Original')
self.change(self.variable)
print(self.variable.value)
def change(self, var):
var.value = 'Changed'
pbr = PassByReference()
पास-दर-संदर्भ अनुकरण करने के लिए एक शब्दकोश पास करना
पायथन: म्यूटेबल स्टेट पासिंग के लिए शब्दकोशों का उपयोग करना
class PassByReference:
def __init__(self):
self.variable = {'key': 'Original'}
self.change(self.variable)
print(self.variable['key'])
def change(self, var):
var['key'] = 'Changed'
pbr = PassByReference()
पायथन के परिवर्तनीय हैंडलिंग तंत्र को समझना
पायथन में, वेरिएबल पासिंग की अवधारणा जटिल हो सकती है, खासकर जब परिवर्तनशील और अपरिवर्तनीय वस्तुओं के बीच अंतर करना। सूचियाँ और शब्दकोश जैसी परिवर्तनशील वस्तुओं को स्थान पर बदला जा सकता है, जिसका अर्थ है कि यदि आप किसी परिवर्तनशील वस्तु को किसी फ़ंक्शन में पास करते हैं, तो फ़ंक्शन के भीतर किया गया कोई भी संशोधन फ़ंक्शन के बाहर मूल वस्तु को प्रभावित करेगा। दूसरी ओर, अपरिवर्तनीय वस्तुएं, जैसे स्ट्रिंग्स और टुपल्स, को जगह में नहीं बदला जा सकता है। इसलिए, जब आप किसी अपरिवर्तनीय ऑब्जेक्ट को किसी फ़ंक्शन में पास करते हैं, तो फ़ंक्शन के भीतर कोई भी संशोधन एक नया ऑब्जेक्ट बनाता है, जिससे मूल ऑब्जेक्ट अपरिवर्तित रहता है।
पायथन में वेरिएबल हैंडलिंग के एक अन्य पहलू में यह समझना शामिल है कि संदर्भ कैसे काम करते हैं। जब आप एक वेरिएबल को दूसरे वेरिएबल में असाइन करते हैं, तो आप वास्तव में ऑब्जेक्ट का संदर्भ असाइन कर रहे होते हैं, न कि ऑब्जेक्ट की प्रतिलिपि बना रहे होते हैं। इसका मतलब यह है कि यदि वस्तु परिवर्तनशील है और आप इसे किसी भी चर के माध्यम से संशोधित करते हैं, तो परिवर्तन सभी संदर्भों में दिखाई देंगे। परिवर्तनशील प्रकारों या कस्टम कक्षाओं का उपयोग करके पास-दर-संदर्भ की नकल करने के लिए इस व्यवहार का लाभ उठाया जा सकता है। इसके अतिरिक्त, नेस्टेड फ़ंक्शंस के भीतर वैश्विक और गैर-स्थानीय चर को संभालने वाला पायथन परिवर्तनीय दायरे और परिवर्तनशीलता को प्रबंधित करने का एक और तरीका प्रदान करता है।
पायथन में वेरिएबल पासिंग के बारे में सामान्य प्रश्न
- क्या पायथन पास-बाय-वैल्यू या पास-बाय-रेफरेंस है?
- पायथन "पास-बाय-ऑब्जेक्ट-रेफरेंस" नामक एक तंत्र का उपयोग करता है जहां वस्तुओं के संदर्भ पारित किए जाते हैं, न कि वस्तुओं के।
- किसी फ़ंक्शन को पास करने पर मेरी स्ट्रिंग क्यों नहीं बदलती?
- पायथन में स्ट्रिंग्स अपरिवर्तनीय हैं, इसलिए किसी फ़ंक्शन के अंदर कोई भी संशोधन मूल को संशोधित करने के बजाय एक नई स्ट्रिंग बनाता है।
- मैं अपरिवर्तनीय प्रकारों के साथ पास-बाय-रेफरेंस का अनुकरण कैसे कर सकता हूं?
- अपरिवर्तनीय प्रकार को पकड़ने और इसके बजाय कंटेनर को पास करने के लिए एक सूची या शब्दकोश जैसे परिवर्तनशील कंटेनर का उपयोग करें।
- जब मैं किसी फ़ंक्शन के अंदर एक वेरिएबल को पुन: असाइन करता हूं तो क्या होता है?
- किसी फ़ंक्शन के अंदर एक वेरिएबल को पुन: असाइन करने से स्थानीय संदर्भ बदल जाता है, फ़ंक्शन के बाहर मूल वेरिएबल नहीं।
- क्या मैं किसी फ़ंक्शन के अंदर वैश्विक वैरिएबल को संशोधित कर सकता हूं?
- हाँ, का उपयोग करके वेरिएबल को वैश्विक घोषित करके global कीवर्ड.
- क्या है nonlocal कीवर्ड किसके लिए उपयोग किया जाता है?
- nonlocal कीवर्ड आपको निकटतम संलग्न दायरे में वेरिएबल्स को संशोधित करने की अनुमति देता है जो वैश्विक नहीं है।
- फ़ंक्शंस में भेजे जाने पर शब्दकोश कैसे व्यवहार करते हैं?
- शब्दकोश, परिवर्तनशील होने के कारण, मूल वस्तु में कार्यों के भीतर किए गए परिवर्तनों को प्रतिबिंबित करते हैं।
- क्या मैं पायथन में संदर्भ द्वारा एक कस्टम ऑब्जेक्ट पास कर सकता हूँ?
- हां, कस्टम ऑब्जेक्ट को पास करना परिवर्तनशील प्रकारों की तरह काम करता है, जहां फ़ंक्शन के भीतर विशेषताओं में परिवर्तन मूल ऑब्जेक्ट को प्रभावित करते हैं।
- रैपर क्लास क्या है, और यह वेरिएबल पासिंग में कैसे मदद करता है?
- एक रैपर वर्ग एक मान को समाहित करता है, जो अन्यथा अपरिवर्तनीय प्रकार के लिए एक परिवर्तनीय संदर्भ प्रदान करता है।
पायथन वेरिएबल पासिंग पर समापन अंतर्दृष्टि
प्रभावी प्रोग्रामिंग के लिए यह समझना महत्वपूर्ण है कि पायथन वेरिएबल पासिंग को कैसे संभालता है। परिवर्तनशील वस्तुओं और कस्टम कक्षाओं का लाभ उठाकर, डेवलपर्स पास-दर-संदर्भ अनुकरण कर सकते हैं, जिससे फ़ंक्शंस को सीधे चर को संशोधित करने की अनुमति मिलती है। यह ज्ञान अधिक कुशल और पूर्वानुमानित कोड लिखने में मदद करता है, जिससे पायथन कार्यक्रमों के भीतर परिवर्तनीय दायरे और परिवर्तनशीलता को प्रबंधित करने की क्षमता बढ़ती है। इन तकनीकों को लागू करने से यह सुनिश्चित होता है कि वांछित परिवर्तन कार्य सीमाओं में परिलक्षित होते हैं।