मैं सिर्फ सीखने अजगर और मैं इस उदाहरण लेकर संदेह में हूँ शुरू कर दिया? मैं उपरोक्त कोड को जानता हूं लेकिन मेरे सिर को "प्रारंभिक एक बार" विवरण के चारों ओर लपेट नहीं सकता।अजगर डिफ़ॉल्ट पैरामीटर भ्रम
उत्तर
यदि "टू" को एक बार शुरू किया गया था, तो "नहीं" दूसरी बार "कोई नहीं" नहीं होगा?
to
बन जाएगा None
यदि आप इसके लिए एक मूल्य उत्तीर्ण नहीं होते हैं: to = []
: append_to(1)
और केवल जब to
None
अपने कोड को अपने समारोह के शरीर के अंदर एक नव निर्मित सूची में स्थानीय नाम 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, पर जाती है लेकिन तर्कों के डिफ़ॉल्ट मान नहीं, वे फ़ंक्शन के निष्पादन के बाद रहते हैं और आम तौर पर निष्पादन के बाद कचरा-एकत्र नहीं होते हैं फ़ंक्शन।
मुझे लगता है कि मुझे कुछ बार पढ़ने के बाद क्या मतलब है। यहां कुंजी परिवर्तनीय का दायरा नहीं है बल्कि ऑब्जेक्ट को वैरिएबल प्रारंभ करने के लिए उपयोग की जाती है। जब वे कहते हैं कि "एक बार आरंभ किया गया" तो उनका मतलब उस ऑब्जेक्ट को प्रारंभ करना था जहां पैरामीटर एक बार इंगित कर रहा है और फ़ंक्शन को हर बार पैरामीटर पर उस ऑब्जेक्ट को लिंक करता है। तो अगर वस्तु अपरिवर्तनीय है, तो इसे कभी नहीं बदला जा सकता है। यदि यह उत्परिवर्तनीय है, तो यह अंतिम मूल्य बनाए रखेगा। अब यह सब स्पष्ट है। धन्यवाद! – dreamfly
मैं परिशुद्धता के लिए यहां प्रारंभिकरण के बजाय शब्द * असाइनमेंट * का उपयोग करना चाहता हूं। और हाँ आप सही हैं, अगर कोई वस्तु अपरिवर्तनीय है, तो आप इसे बदल नहीं सकते हैं। म्यूटेबल्स के विपरीत जहां आप ऑब्जेक्ट 'डी [0] = 20' के * भाग * को बदल सकते हैं, यहां आपने वास्तव में केवल' डी', इंडेक्स 0 का हिस्सा बदल दिया है। उदाहरण के लिए आप इनट्स या टुपल्स का हिस्सा नहीं बदल सकते हैं, क्योंकि वे ' पुन: अपरिवर्तनीय: 'ए = 20' और फिर आप' a' से 30: 'a = 30' को पुनः मानते हैं,' ए 'का एक अलग संदर्भ 30 है और 'a' पिछले' ए' जैसा नहीं है। उम्मीद है कि यह अब समझ में आता है :) – direprobs
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]
के अन्य हिस्सों को तोड़ सकता है, "टू" भी एक स्थानीय चर नहीं है और जो कुछ भी यह इंगित करता है कि "[]" कचरा कचरा जाएगा क्योंकि समारोह से बाहर निकलने के बाद "टू" भी चला जाएगा? – dreamfly
नहीं, यह स्थानीय चर नहीं है और यह 'append_to' के बाद भी नहीं चलाया जाएगा क्योंकि यह कार्य करने के लिए बाध्य है। आप 'append_to' को कॉल करते रहते हैं, वही' to' मान नए तत्व जोड़े जाते हैं। – ozgur
तो क्या "to = none" को स्थानीय चर और "to = []" स्थानीय चर नहीं बनाता है? क्या यह मूल्य की व्यवहार्यता पर निर्भर है? ऐसा हो सकता है कि मैं मानसिक रूप से इसे कैसे याद कर सकता हूं भले ही यह मेरे लिए थोड़ा अजीब है। – dreamfly
अजगर में कोई घोषणा और आरंभीकरण चरण है जब आप एक का उपयोग चर। इसके बजाए, सभी असाइनमेंट एक परिभाषा है जहां आप परिवर्तनीय नाम के लिए एक उदाहरण बांधते हैं।
दुभाषिया फ़ंक्शन को तुरंत चालू करते समय उदाहरण को डिफ़ॉल्ट मान से जोड़ता है। जब डिफ़ॉल्ट मान एक म्यूटेबल ऑब्जेक्ट होता है और आप केवल अपनी स्थिति को इसके तरीकों से बदलते हैं तो मूल्य कॉल के बीच "साझा" किया जाएगा।
- 1. अजगर वर्ग डिफ़ॉल्ट पैरामीटर
- 2. भ्रम मैट्रिक्स (अजगर/matplotlib)
- 3. अजगर तरीके: डिफ़ॉल्ट पैरामीटर मान एक बार
- 4. SqlCommand पैरामीटर आकार भ्रम
- 5. अजगर निर्माता और डिफ़ॉल्ट मान
- 6. डिफ़ॉल्ट फ़ॉन्ट अजगर
- 7. अजगर वैकल्पिक पैरामीटर
- 8. प्रिंट भ्रम
- 9. C# डिफ़ॉल्ट पैरामीटर
- 10. वर्चुअल फ़ंक्शंस डिफ़ॉल्ट पैरामीटर
- 11. त्रुटि: डिफ़ॉल्ट पैरामीटर 1
- 12. जावास्क्रिप्ट डिफ़ॉल्ट पैरामीटर
- 13. उद्देश्य सी डिफ़ॉल्ट पैरामीटर?
- 14. डिफ़ॉल्ट पैरामीटर मान
- 15. भ्रम भाव
- 16. भ्रम
- 17. भ्रम
- 18. वैकल्पिक पैरामीटर और उनके डिफ़ॉल्ट मानों
- 19. भ्रम ++ मानकों
- 20. SSRS तारीख डिफ़ॉल्ट जैसे पैरामीटर
- 21. ES6 ऑब्जेक्ट डिस्ट्रक्चरिंग डिफ़ॉल्ट पैरामीटर
- 22. फंक्शन ओवरलोडिंग बनाम डिफ़ॉल्ट पैरामीटर?
- 23. विधि पैरामीटर सरणी डिफ़ॉल्ट मान
- 24. पीएचपी समारोह - कुछ डिफ़ॉल्ट पैरामीटर
- 25. कोणीय यूआई राउटर - डिफ़ॉल्ट पैरामीटर
- 26. दोस्त भ्रम
- 27. एमआईएम आरएफसी "सामग्री-प्रकार" पैरामीटर भ्रम? अस्पष्ट आरएफसी विनिर्देश
- 28. टीके संदेशबॉक्स आयात भ्रम
- 29. अजगर SIGINT रीसेट संकेत हैंडलर डिफ़ॉल्ट
- 30. विज्ञान-सीखने भ्रम मैट्रिक्स
इस बुरे उदाहरण में (मैं इसे बुरी तरह बुलाता हूं क्योंकि यदि आप 'str' पास करते हैं तो यह चीज़ मलबे हो जाती है ...) वैसे भी, यहां '''' 'कोई नहीं है' या कोई सूची है।यदि '' '' ''' नहीं है तो आप एक सूची नहीं बनाएंगे। इसलिए, आप इस फैशन के कॉल के तहत केवल 'to' के लिए मान असाइन करते हैं: 'append_to (' dreamfly ')' इस मामले में: 'append_to (' dreamfly ', उपयोगकर्ता)' जहां 'उपयोगकर्ता' एक सूची होगी, आप फ़ंक्शन के अंदर कोई सूची नहीं बनाते हैं, आप केवल मान ('users = [..., 'dreamfly']') जोड़ते हैं। –
यह http://python-guide-pt-br.readthedocs.io/en/latest/writing/gotchas/ – dreamfly
से एक उदाहरण है मैंने कुछ [फीडबैक] दिया है (https://github.com/kennethreitz/python-guide/मुद्दों/813); उदाहरण गैर-म्यूटेबल ऑब्जेक्ट्स को डिफ़ॉल्ट तर्क के रूप में उपयोग करता है जो एक अच्छी बात है लेकिन अनुपलब्ध सत्यापन आपके "to = []" उदाहरण में कोड –