2017-04-04 8 views
7

इस प्रश्न में पायथन के लिए अपेक्षाकृत नया होने के नाते मैं कुछ गलत शब्दावली का उपयोग कर सकता हूं और गलतफहमी प्रदर्शित करूंगा - जो मैं यहां हूं।पायथन। पैरामीटर्स और लौटे गए मान

मैं पायथन कार्यों का अध्ययन कर रहा हूं और यह सुनिश्चित करने की कोशिश कर रहा हूं कि मैं समझता हूं कि चर कैसे पारित किए जाते हैं और लौटे जाते हैं।

मैं एक सूची

def func_sort_list(NN): 
    for w in NN: 
     print (w, type(w)) 

    NN.sort() 
    print (NN) 

    return (w) 

मैं एक सूची के लिए मान निर्दिष्ट है

unsort_letters=['q','w','e','r','t','y'] 

तब मैं envoke समारोह

func_sort_list(unsort_letters) 

और में आइटम सॉर्ट करने के लिए इस तुच्छ समारोह में लिखा है परिणाम प्राप्त करें

q <class 'str'> 
w <class 'str'> 
e <class 'str'> 
r <class 'str'> 
t <class 'str'> 
y <class 'str'> 
['e', 'q', 'r', 't', 'w', 'y'] 
'y' 

तो, निष्पादन के बाद, अगर मैं चर मैं मूल रूप से कार्य करने के लिए पारित कर दिया की सामग्री प्रदर्शित मैं

unsort_letters 
['e', 'q', 'r', 't', 'w', 'y'] 

कौन सा परिणाम मैं चाहता है मिलता है।

क्या सही हुआ है, इसकी निम्नलिखित व्याख्या है ताकि मैं कार्य लिखते समय थोड़ा अधिक सुरक्षित महसूस कर सकूं?

  1. unsort_letters, ['q', 'w', 'e', ​​...] का मूल मान "वैश्विक" है?

  2. func_sort_list (unsort_letters) पर कॉल करके मैंने unsc_letters के पते/सूचक को func_sort_list में पास कर दिया है?

  3. एनएन फ़ंक्शन में एक चर "स्थानीय" है लेकिन इसमें पास चर के लिए सूचक/पता है और चूंकि एक सूची उत्परिवर्तनीय है, फ़ंक्शन के भीतर unsort_letters की सामग्री बदल दी जा रही है?

कौन सा मुझे की ओर जाता है:

  1. वहाँ कभी एक परिस्थिति जब मैं समारोह के भीतर पारित पैरामीटर की सामग्री को बदल नहीं सकते है और मैं कुछ लिखने के लिए है निम्नलिखित की तरह?

    def func_return_only(input_parm): 
        result_var = << some processing on input_parm goes here>> 
    
    return (result_var) 
    

कौन सा मैं के रूप में var_s में लौटे मूल्यों के मूल्य पर प्राप्त करने के लिए इस प्रकार envoke किया है।

var_s = func_return_only(<< my input variable or value>>) 

?

+0

[यह उदाहरण] (दस्तावेज में http://stackoverflow.com/documentation/python/228/functions/2920/argument-passing-and-mutability) इस मुद्दे को अच्छी तरह बताता है। – user2314737

+0

लिंक के लिए धन्यवाद। की सराहना की। –

उत्तर

6

आपका मानसिक मॉडल काफी सही है। हालांकि, आपको इस बारे में चिंता नहीं करनी चाहिए कि क्या पाइथन "मूल्य से गुजरता है" या "संदर्भ द्वारा पास" है। आपको सीखना होगा कि पायथन में असाइनमेंट कैसे काम करता है। This ऐसा करने के लिए सबसे अच्छा संसाधन है। जानने के लिए सबसे महत्वपूर्ण तथ्य यह है कि असाइनमेंट डेटा डेटा कॉपी नहीं करता है।

एक बार जब आप असाइनमेंट को समझ लेते हैं, तो केवल एक चीज आपको जानना है कि फ़ंक्शन पैरामीटर असाइनमेंट द्वारा पास किए जाते हैं।

पहली बात यह है कि परोक्ष होता है जब आप कहते हैं अपने कार्य

NN = unsort_letters 

आप तर्क के रूप में unsort_letters में पारित कर दिया है। आप उस तर्क के लिए अन्य नाम (NN) असाइन करते हैं - और यही वह है, कोई डेटा कॉपी नहीं किया गया है।

वहाँ कभी एक परिस्थिति जब मैं समारोह

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

यह ध्यान रखना महत्वपूर्ण है कि पाइथन असाइनमेंट और पैरामीटर पासिंग के दौरान अलग-अलग और अपरिवर्तनीय प्रकारों का अलग-अलग व्यवहार नहीं करता है। आप बस अपरिवर्तनीय प्रकारों को म्यूट नहीं कर सकते क्योंकि उनके पास कोई उत्परिवर्तन नहीं है।

+2

उद्धरण "आपने तर्क के रूप में unsort_letters में पास किया है। आप उस तर्क के लिए एक और नाम (एनएन) असाइन करते हैं - और यही वह है, कोई डेटा कॉपी नहीं किया गया है।" यह पूरी तरह से समझ में आता है। यूट्यूब लिंक के लिए धन्यवाद। –

+0

@CliveLong कोई समस्या नहीं, अच्छे प्रश्न के लिए धन्यवाद। – timgeb

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