2009-09-29 17 views
5

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

इससे मुझे विश्वास होता है कि पायथन के बूल मूल्य से गुजरते हैं। क्या यह सच है? अन्य पाइथन प्रकार इस तरह से व्यवहार करते हैं?

+0

डुप्लिकेट, कृपया http://stackoverflow.com/questions/534375/passing-values-in-python –

उत्तर

12

पायथन चर सी ++ भावना में "संदर्भ" नहीं हैं। इसके बजाय, वे स्मृति में कुछ मनमाने ढंग से स्थान पर किसी ऑब्जेक्ट से जुड़े स्थानीय नाम हैं। यदि वह ऑब्जेक्ट स्वयं उत्परिवर्तनीय है, तो इसमें परिवर्तन अन्य क्षेत्रों में दिखाई देगा जो ऑब्जेक्ट को नाम से बंधे हैं। कई आदिम प्रकार (bool, int, str, और tuple) अपरिवर्तनीय हैं। आप अपना मूल्य जगह में नहीं बदल सकते हैं; बल्कि, आप अपने स्थानीय दायरे में एक ही नाम के लिए एक नया मान असाइन करते हैं।

वास्तव में, लगभग किसी भी समय * आप प्रपत्र foo = X का कोड देखते हैं, इसका मतलब है कि नाम foo अपने वर्तमान स्थानीय नाम स्थान के भीतर एक नया मूल्य (X) सौंपा जा रहा है, न कि foo द्वारा नाम याद में एक स्थान है इसके आंतरिक सूचक को X के स्थान पर संदर्भित करने के लिए अद्यतन किया गया है।

* - पायथन में इसका एकमात्र अपवाद गुणों के लिए सेटर विधियां है, जो आपको obj.foo = X लिखने की अनुमति दे सकता है और इसे obj.setFoo(X) जैसी विधि को कॉल करने के लिए पृष्ठभूमि में फिर से लिखा गया है।

+0

हां, पाइथन में सख्ती से बोलना पते से गुजरता है। पायथन में केवल एक बहस-गुजरने की प्रक्रिया है। यह सिर्फ इतना तथ्य है कि कुछ वस्तुएं उत्परिवर्तनीय हैं और अन्य भ्रम नहीं देते हैं कि कुछ जादुई रूप से अधिक जटिल होता है। –

1

यह इस बात पर निर्भर करता है कि वस्तु उत्परिवर्तनीय या अपरिवर्तनीय है या नहीं। अपरिवर्तनीय वस्तुएं व्यवहार करती हैं जैसे आपने बूल के साथ देखा, जबकि परिवर्तनीय वस्तुएं बदल जाएंगी।

संदर्भ के लिए: http://www.testingreflections.com/node/view/5126

अजगर गुजरता संदर्भ करने वाली वस्तुओं अजगर में (जावा) की तरह मूल्य, और सब कुछ द्वारा एक वस्तु है। यह आसान लगता है, लेकिन फिर आप देखेंगे कि कुछ डेटा प्रकार पास-दर-मूल्य विशेषताओं को प्रदर्शित करते हैं, जबकि अन्य पास-दर-संदर्भ की तरह कार्य करते हैं ... सौदा क्या है?

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

+0

-1 देखें: सबसे पहले यह उल्लिखित डुप्लिकेट प्रश्न के स्वीकृत उत्तर की एक प्रति प्रतीत होता है (जो हो सकता है संयोग)।दूसरा, आप केवल अपरिवर्तनीय वस्तुओं को बदल नहीं सकते हैं - यह अपरिवर्तनीय साधन है। यह कहकर कि अपरिवर्तनीय वस्तुओं को बदलना एक नया उदाहरण बनाता है, इस मुद्दे को भ्रमित कर रहा है। आप एक अपरिवर्तनीय वस्तु के नाम को पुनर्जीवित कर सकते हैं, लेकिन यह वही बात नहीं है! –

+0

दिलचस्प, मैंने डुप्लिकेट भी नहीं देखा। जब मैंने उत्तर दिया तो इस सवाल को डुप्लिकेट लेबल नहीं किया गया था। गुगलिंग "संदर्भ द्वारा पायथन पास" ने मुझे उपरोक्त लिंक दिया। साथ ही, संयोग से, आपके द्वारा जारी किए गए उद्धरण को डुप्लिकेट द्वारा स्वीकृत उत्तर दिया गया है। मुझे यह समझना मुश्किल नहीं लगता है कि यदि पाइथन जगह में संपादित कर सकता है तो यह होगा, और यदि यह नहीं कर सकता है तो यह स्थानीय प्रतिलिपि बनायेगा। यहां एक और साइट है जो ऊपर दिए गए लिंक का उद्धरण देती है लेकिन अधिक स्पष्टीकरण प्रदान करती है: http://bogdan.org.ua/2008/02/11/python-passing-by-value-vs-passing-by-reference.html – FModa3

0

संक्षेप में, पायथन में कोई चर नहीं है; वस्तुएं हैं (सत्य और झूठी की तरह, बूल अपरिवर्तनीय होते हैं), और नाम। नाम वे हैं जिन्हें आप चर कहते हैं, लेकिन नाम एक दायरे से संबंधित हैं, आप आम तौर पर स्थानीय नामों के अलावा अन्य नाम नहीं बदल सकते हैं।

+1

"पाइथन में कोई चर नहीं है" पैडेंटिक और भ्रामक है, मैं वास्तव में चाहता हूं कि लोग इसे कहना बंद कर दें। –

1

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

संबंधित मुद्दे