2011-06-22 20 views
28

संभव डुप्लिकेट:
“Least Astonishment” in Python: The Mutable Default Argumentवैकल्पिक पैरामीटर और उनके डिफ़ॉल्ट मानों

मैं उलझन में एक तरह से के बारे में कैसे वैकल्पिक पैरामीटर अजगर कार्य/तरीकों में काम कर रहा हूँ।

मैं निम्नलिखित कोड ब्लॉक है:

>>> def F(a, b=[]): 
...  b.append(a) 
...  return b 
... 
>>> F(0) 
[0] 
>>> F(1) 
[0, 1] 
>>> 

क्यों F(1) रिटर्न [0, 1] और नहीं [1]?

मेरा मतलब है, के अंदर क्या हो रहा है?

+0

आपको लगता है कि आसानी से देख सकते बस जोड़कर से पहले ख का मूल्य मुद्रण द्वारा: एक डिफ़ॉल्ट सूची प्राप्त (या शब्दकोश, या सेट) करने का सही तरीका रन टाइम पर यह बजाय बनाने के लिए, समारोह के अंदर है सूची में। :) – sam

उत्तर

38

कुछ साल पहले PyCon से अच्छा दस्तावेज़ - Default parameter values explained। लेकिन मूल रूप से, चूंकि सूचियां म्यूटेबल ऑब्जेक्ट्स हैं, और कीवर्ड तर्कों का मूल्यांकन फ़ंक्शन परिभाषा समय पर किया जाता है, हर बार जब आप फ़ंक्शन को कॉल करते हैं, तो आपको वही डिफ़ॉल्ट मान मिलता है।

इस होगा करने के लिए सही रास्ता:

def F(a, b=None): 
    if b is None: 
     b = [] 
    b.append(a) 
    return b 
8

Default parameters, कर रहे हैं काफी सहज, कुछ हद तक समारोह वस्तु पर सदस्य चर की तरह।

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

http://docs.python.org/reference/compound_stmts.html#function

सूचियाँ एक परिवर्तनशील वस्तुओं रहे हैं; आप उनकी सामग्री बदल सकते हैं।

def good_append(new_item, a_list=None): 
    if a_list is None: 
     a_list = [] 
    a_list.append(new_item) 
    return a_list 
संबंधित मुद्दे