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

print a() 
print a() 

Birdenbire 2 elem ile bir listeye sahibim, ama nasıl? Her seferinde boş listeye ayarlanmamalı. fonksiyon tanımlandığında yardımpython'daki kapanış sorusunu anlamıyor

+2

Ayrıca bkz http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument –

cevap

9

En azından genel anlamda değil, kapaklarla ilgili bir şey yoktur.

b için varsayılan değer "yeni bir boş liste" değildir; “fonksiyonu tanımlarken yeni oluşturduğum bu özel nesne, boş bir liste haline getiriliyor”. Fonksiyon her argüman olmadan çağrıldığında, aynı nesne kullanılır.

10

Standart argümanlar için

Teşekkür sadece bir kez değerlendirilir. Aynı nesneyi bir çağrısından diğerine kadar korur, yani aynı liste eklemeye devam eder. Varsayılan olarak None değerini kullanın ve bunun üstesinden gelmek istiyorsanız bunun yerine bakın.

3

düzeltilmiş versiyon, diğer yanıtlar verilen nedenlerden dolayı: function tanımlanır zaman

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

    b.append(1) 
    return b 
1

varsayılan argümanlar değerlendirilir (bir kez) değil, her zaman denir.

bu deneyin:

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

print a() 
print a() 
İlgili konular