2009-05-05 12 views
0

Pourquoi les éléments suivants:Initialisation du args mot-clé en Python

class A(object): 
    def __init__(self, var=[]): 
     self._var = var 
     print 'var = %s %s' % (var, id(var)) 

a1 = A() 
a1._var.append('one') 

a2 = A() 

résultat dans:

var = [] 182897439952 
var = ['one'] 182897439952 

Je ne comprends pas pourquoi il n'utilise une nouvelle instance d'une liste lors de l'utilisation en option arguments de mot-clé, quelqu'un peut-il expliquer cela?

+3

Il a été expliqué encore et encore. – SilentGhost

+1

Exemple d'explication: http://stackoverflow.com/questions/530530/python-2-x-gotchas-and-landmines –

+1

ou ici: http://stackoverflow.com/questions/366422/what-is-the- pythonic-way-to-avoid-default-parameters-that-are-empty-lists – SilentGhost

Répondre

6

La liste vide dans votre définition de fonction est créée une seule fois, au moment où la fonction elle-même est créée. Il n'est pas créé à chaque fois que la fonction est appelée.

Si vous voulez un nouveau à chaque fois, faites ceci:

class A(object): 
    def __init__(self, var=None): 
     if var is None: 
      var = [] 
     self._var = var 
+0

Une manière plus simple d'écrire c'est (non testé): self._var = var ou [] – wbyoung

+2

Cela ne fait pas la même chose . Par exemple, "1 ou []" est 1, mais "0 ou []" est [] – RichieHindle

2

Ceci est tout simplement faux. Vous ne pouvez pas (de manière significative) fournir un objet mutable en tant que valeur par défaut dans une déclaration de fonction.

class A(object): 
    def __init__(self, var=[]): 
     self._var = var 
     print 'var = %s %s' % (var, id(var)) 

Vous devez faire quelque chose comme ceci.

class A(object): 
    def __init__(self, var=None): 
     self._var = var if var is not None else [] 
     print 'var = %s %s' % (var, id(var)) 
1

La liste vide dans votre définition de la fonction est créée une fois, au moment où la fonction elle-même est créée. Il n'est pas créé à chaque fois que la fonction est appelée.

Exactement. Pour contourner ce problème, affectez None à la définition de la fonction et recherchez None dans le corps de la fonction:

class A(object): 
    def __init__(self, var=None): 
     if var is None: 
      var = [] 
     self._var = var 
     print 'var = %s %s' % (var, id(var))