2017-04-17 4 views
5

मैं सिर्फ सीखने अजगर और मैं इस उदाहरण लेकर संदेह में हूँ शुरू कर दिया? मैं उपरोक्त कोड को जानता हूं लेकिन मेरे सिर को "प्रारंभिक एक बार" विवरण के चारों ओर लपेट नहीं सकता।अजगर डिफ़ॉल्ट पैरामीटर भ्रम

+0

इस बुरे उदाहरण में (मैं इसे बुरी तरह बुलाता हूं क्योंकि यदि आप 'str' पास करते हैं तो यह चीज़ मलबे हो जाती है ...) वैसे भी, यहां '''' 'कोई नहीं है' या कोई सूची है।यदि '' '' ''' नहीं है तो आप एक सूची नहीं बनाएंगे। इसलिए, आप इस फैशन के कॉल के तहत केवल 'to' के लिए मान असाइन करते हैं: 'append_to (' dreamfly ')' इस मामले में: 'append_to (' dreamfly ', उपयोगकर्ता)' जहां 'उपयोगकर्ता' एक सूची होगी, आप फ़ंक्शन के अंदर कोई सूची नहीं बनाते हैं, आप केवल मान ('users = [..., 'dreamfly']') जोड़ते हैं। –

+0

यह http://python-guide-pt-br.readthedocs.io/en/latest/writing/gotchas/ – dreamfly

+0

से एक उदाहरण है मैंने कुछ [फीडबैक] दिया है (https://github.com/kennethreitz/python-guide/मुद्दों/813); उदाहरण गैर-म्यूटेबल ऑब्जेक्ट्स को डिफ़ॉल्ट तर्क के रूप में उपयोग करता है जो एक अच्छी बात है लेकिन अनुपलब्ध सत्यापन आपके "to = []" उदाहरण में कोड –

उत्तर

1

यदि "टू" को एक बार शुरू किया गया था, तो "नहीं" दूसरी बार "कोई नहीं" नहीं होगा?

to बन जाएगा None यदि आप इसके लिए एक मूल्य उत्तीर्ण नहीं होते हैं: to = []: append_to(1) और केवल जब toNone अपने कोड को अपने समारोह के शरीर के अंदर एक नव निर्मित सूची में स्थानीय नाम to rebind जाएगा।

कार्यों के मूलभूत मूल्यों केवल एक बार आवंटित कर रहे हैं, कि आप जो कुछ भी आवंटित एक डिफ़ॉल्ट मान के रूप में, उस वस्तु हर आप कार्य करने के लिए बनाने के फोन और परिवर्तन नहीं होगा, आमतौर पर डिफ़ॉल्ट की इसी संदर्भ के लिए उपयोग किया जाएगा है आपके द्वारा किए गए प्रत्येक कॉल के लिए मूल्य का उपयोग किया जाएगा। यह मायने रखती है जब आप चूक के रूप में mutables आवंटित:

l = [] 
def defArgs(d=l)   # default arguments, same default list for every call 
    d.append(1) 
    return d 

defArgs() is l   # Object identity test: True 

ऊपर समारोह कई बार चलाने के लिए और आप अधिक तत्वों के साथ बढ़ती सूची का निरीक्षण क्योंकि आप हर कार्य हर कार्य कॉल द्वारा साझा के लिए तर्क चूक का केवल एक एक प्रति मिल जाएगा । लेकिन यहाँ नोटिस:

def localVars(d=None): 
    if d is None: 
     d = []    # Different list for every call when d is None 

d = [] हर बार जब आप localVars फोन निष्पादित किया जाता है; जब फ़ंक्शन अपनी नौकरी खत्म कर देता है, तो प्रत्येक स्थानीय चर कचरा-संग्रह होता है जब संदर्भ गणना 0, पर जाती है लेकिन तर्कों के डिफ़ॉल्ट मान नहीं, वे फ़ंक्शन के निष्पादन के बाद रहते हैं और आम तौर पर निष्पादन के बाद कचरा-एकत्र नहीं होते हैं फ़ंक्शन

+0

मुझे लगता है कि मुझे कुछ बार पढ़ने के बाद क्या मतलब है। यहां कुंजी परिवर्तनीय का दायरा नहीं है बल्कि ऑब्जेक्ट को वैरिएबल प्रारंभ करने के लिए उपयोग की जाती है। जब वे कहते हैं कि "एक बार आरंभ किया गया" तो उनका मतलब उस ऑब्जेक्ट को प्रारंभ करना था जहां पैरामीटर एक बार इंगित कर रहा है और फ़ंक्शन को हर बार पैरामीटर पर उस ऑब्जेक्ट को लिंक करता है। तो अगर वस्तु अपरिवर्तनीय है, तो इसे कभी नहीं बदला जा सकता है। यदि यह उत्परिवर्तनीय है, तो यह अंतिम मूल्य बनाए रखेगा। अब यह सब स्पष्ट है। धन्यवाद! – dreamfly

+0

मैं परिशुद्धता के लिए यहां प्रारंभिकरण के बजाय शब्द * असाइनमेंट * का उपयोग करना चाहता हूं। और हाँ आप सही हैं, अगर कोई वस्तु अपरिवर्तनीय है, तो आप इसे बदल नहीं सकते हैं। म्यूटेबल्स के विपरीत जहां आप ऑब्जेक्ट 'डी [0] = 20' के * भाग * को बदल सकते हैं, यहां आपने वास्तव में केवल' डी', इंडेक्स 0 का हिस्सा बदल दिया है। उदाहरण के लिए आप इनट्स या टुपल्स का हिस्सा नहीं बदल सकते हैं, क्योंकि वे ' पुन: अपरिवर्तनीय: 'ए = 20' और फिर आप' a' से 30: 'a = 30' को पुनः मानते हैं,' ए 'का एक अलग संदर्भ 30 है और 'a' पिछले' ए' जैसा नहीं है। उम्मीद है कि यह अब समझ में आता है :) – direprobs

2
def append_to(element, to=None): 
    to = ... 

to यहाँ एक स्थानीय चर हो जाता है और एक सूची को सौंपा गया है, और यदि आप एक और चर के लिए वापसी मान असाइन नहीं करते पुनः आवंटित की जाती है।

आप to चाहते हैं append_to के बाद कॉल के लिए जिंदा रहने आपको क्या करना चाहिए:

def append_to(element, to=[]): 
    to.append(element) 
    return to 

डेमो:

>>> lst = append_to(5) 
>>> append_to(6) 
>>> append_to(7) 
>>> print lst 
[5, 6, 7] 
+0

के अन्य हिस्सों को तोड़ सकता है, "टू" भी एक स्थानीय चर नहीं है और जो कुछ भी यह इंगित करता है कि "[]" कचरा कचरा जाएगा क्योंकि समारोह से बाहर निकलने के बाद "टू" भी चला जाएगा? – dreamfly

+0

नहीं, यह स्थानीय चर नहीं है और यह 'append_to' के बाद भी नहीं चलाया जाएगा क्योंकि यह कार्य करने के लिए बाध्य है। आप 'append_to' को कॉल करते रहते हैं, वही' to' मान नए तत्व जोड़े जाते हैं। – ozgur

+0

तो क्या "to = none" को स्थानीय चर और "to = []" स्थानीय चर नहीं बनाता है? क्या यह मूल्य की व्यवहार्यता पर निर्भर है? ऐसा हो सकता है कि मैं मानसिक रूप से इसे कैसे याद कर सकता हूं भले ही यह मेरे लिए थोड़ा अजीब है। – dreamfly

0

अजगर में कोई घोषणा और आरंभीकरण चरण है जब आप एक का उपयोग चर। इसके बजाए, सभी असाइनमेंट एक परिभाषा है जहां आप परिवर्तनीय नाम के लिए एक उदाहरण बांधते हैं।

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

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