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

print a() 
print a() 

Tout d'un coup, j'ai eu une liste avec 2 elems, mais comment? Ne devrait pas être mis à la liste vide chaque fois.ne comprend pas les questions de fermetures en python

Merci pour l'aide

+2

Voir aussi http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument –

Répondre

9

Rien à voir avec des fermetures, du moins pas dans le sens habituel.

La valeur par défaut pour b n'est pas "une nouvelle liste vide"; c'est "cet objet particulier que je viens de créer en définissant la fonction, en l'initialisant comme une liste vide". Chaque fois que la fonction est appelée sans argument, le même objet est utilisé.

10

arguments par défaut ne sont évalués une fois, lorsque la fonction est définie. Il conserve le même objet d'une invocation à l'autre, ce qui signifie que la même liste continue d'être ajoutée. Utilisez une valeur par défaut de None et vérifiez à la place si vous voulez contourner cela.

3

La version corrigée, pour les raisons exposées dans d'autres réponses, est:

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

    b.append(1) 
    return b 
1

arguments par défaut sont évalués (une fois) lorsque la fonction est définie, pas à chaque fois qu'il est appelé.

essayez ceci:

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

print a() 
print a()