2010-12-04 8 views
5
def a(b=[]): 
    b.append(1) 
    return b 

print a() 
print a() 

अचानक बंद होने पर मुझे 2 elems के साथ एक सूची मिली, लेकिन कैसे? बी हर बार खाली सूची में सेट नहीं होना चाहिए।पाइथन

मदद

+2

भी देखें http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument –

उत्तर

9

कम से कम सामान्य ज्ञान में बंद होने के साथ कुछ भी नहीं करना।

b के लिए डिफ़ॉल्ट मान "एक नई खाली सूची" नहीं है; यह "यह विशेष वस्तु है जिसे मैंने अभी फ़ंक्शन को परिभाषित करते समय बनाया है, इसे एक खाली सूची के रूप में प्रारंभ किया है"। हर बार फ़ंक्शन को तर्क के बिना बुलाया जाता है, वही ऑब्जेक्ट का उपयोग किया जाता है।

10

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

3

सही संस्करण, अन्य उत्तर में दिए गए कारणों के लिए, यह है:

def a(b=None): 
    b = [] if b is None else b 

    b.append(1) 
    return b 
1

डिफ़ॉल्ट तर्क मूल्यांकन किया जाता है (एक बार) जब समारोह परिभाषित किया गया है, नहीं हर बार यह कहा जाता है।

इस प्रयास करें:

def a(b=None): 
    if b is None 
     b = []  
    b.append(1) 
    return b 

print a() 
print a()