2011-05-28 21 views
10

मुझे लगता है कि पायथन में अनुक्रम प्रकार मूल्य प्रकार थे। यह पता चला है कि वे संदर्भ प्रकार हैं (मतलब यह है कि किसी वैरिएबल का मान प्रतिलिपि नहीं किया जाएगा जब किसी नए चर को सौंपा गया हो, लेकिन संदर्भित किया गया हो)। तो अब मैं सोच रहा हूं, पायथन में मूल्य प्रकार क्या हैं? यही है, पाइथन में किस प्रकार के नए चर के लिए असाइन किए बिना चिंता कर सकते हैं कि चर का संदर्भ दिया गया था?पाइथन संदर्भ प्रकार के रूप में क्या व्यवहार करता है?

उत्तर

17

पाइथन में सभी मान संदर्भ हैं। आपको इसके बारे में चिंता करने की ज़रूरत है यदि कोई प्रकार परिवर्तनीय है। मूल संख्यात्मक और स्ट्रिंग प्रकार, साथ ही tuple और frozenset अपरिवर्तनीय हैं; उन नामों में से किसी एक वस्तु के लिए बाध्य नाम केवल उत्परिवर्तित नहीं हो सकते हैं।

>>> t = 1, 2, 3 
>>> t[1] = 42 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'tuple' object does not support item assignment 
+5

पूर्णता के लिए यह ध्यान दिया जाना चाहिए कि, जबकि एक ट्यूपल अपरिवर्तनीय है, इसमें निहित किसी भी परिवर्तनीय वस्तु को उत्परिवर्तित किया जा सकता है: 't = 1, [2], 3; टी [1] .append (42) ' –

+0

पूर्णता के लिए, क्या आप जोड़ सकते हैं कि मैं मूल्य को डुप्लिकेट/क्लोन करने के बारे में कैसे जाऊं? – Hubro

+1

यह इस प्रकार पर निर्भर करता है। सूचियों के लिए, आप या तो इसे 'सूची()' पर पास कर सकते हैं या पूरी चीज ('एल [:]') को टुकड़ा कर सकते हैं। सेट के लिए, इसे 'सेट() 'पर पास करें। अन्य प्रकार के लिए, प्रासंगिक दस्तावेज देखें। ध्यान दें कि * ऐसे * प्रकार हैं जिन्हें प्रभावी रूप से क्लोन नहीं किया जा सकता है, क्योंकि वे बाहरी संसाधन (उदा। 'सॉकेट') का प्रतिनिधित्व करते हैं। –

4

जवाब ऊपर सही है, लेकिन मैं "संदर्भ" के शब्दों पर आपत्ति।

सी-जैसी भाषाएं निश्चित बाल्टी के रूप में चर का इलाज करती हैं, जिसमें मूल्य रखे जाते हैं। जब आप कोई फ़ंक्शन कॉल करते हैं, तो बाल्टी का एक नया सेट बनाया जाता है, और मूल्यों की प्रतिलिपि बनाई जाती है। कभी-कभी, एक बाल्टी पास-बाय-रेफरेंस होती है, और वास्तव में कॉलर की बाल्टी के लिए उपनाम बन जाती है।

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

पायथन के संदर्भ में "संदर्भ" का उल्लेख करना समझ में नहीं आता है, क्योंकि हर दूसरी भाषा में, "संदर्भ" का अर्थ "मूल्य" का विकल्प है। पाइथन में ऐसी कोई द्वंद्व नहीं है; यह बस चारों ओर गुजरता है और वस्तुओं को असाइन करता है। कुछ भी से संदर्भित नहीं है।

नाइटपीकी, शायद, लेकिन शब्दावली सी ++ प्रोग्रामर के लिए भ्रम का कोई अंत नहीं करती है, जो उदा। पाइथन संदर्भों से गुज़रता है और यह नहीं समझता कि कॉलर के नामों को फिर से कैसे सौंपना है।

+3

पायथन मूल्य से गुजरता है, लेकिन मान संदर्भ हैं। –

+0

यह मूर्खतापूर्ण है। पारित मूल्य वस्तुओं के संदर्भ नहीं हैं; वे वस्तुएं हैं। – Eevee

+2

शायद यह आलेख (http://bit.ly/4Cjmn0) और SO SO प्रश्न जो उससे जुड़ा हुआ है (http://bit.ly/3fRXW) इस पर कुछ प्रकाश डाल सकता है। मुझे लगता है कि लेख में उपयोग की जाने वाली शब्दावली चीजों को थोड़ा कम भ्रमित करने में मदद करती है। इसके अलावा, जब मैं संदर्भों के बारे में आपकी बात देखता हूं, तो मैं इसके साथ असहमत हूं। शब्द के सामान्य अर्थ में एक लेबल या नाम एक संदर्भ है। जब मैं आपके नाम का उपयोग करता हूं, तो मैं आपको * रेफरिंग * कर रहा हूं। – cledoux