Question

Pourquoi ce qui suit:

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 pas une nouvelle instance d'une liste lorsque des arguments de mots clés optionnels sont utilisés, quelqu'un peut-il expliquer cela?

Était-ce utile?

La solution

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

Si vous en voulez un nouveau à chaque fois, procédez comme suit:

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

Autres conseils

C'est tout simplement faux. Vous ne pouvez pas (de manière significative) fournir un objet mutable comme 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 ça.

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

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

Exactement. Pour contourner cette assignation Aucune dans la définition de la fonction et recherchez Aucune 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))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top