Initialisation des arguments de mots clés en Python
-
05-07-2019 - |
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?
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))