Pregunta

¿Por qué hace lo siguiente:

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()

resultado en:

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

No entiendo por qué no está usando una nueva instancia de una lista cuando se usan argumentos de palabras clave opcionales, ¿alguien puede explicar esto?

¿Fue útil?

Solución

La lista vacía en su definición de función se crea una vez, en el momento en que se crea la función. No se crea cada vez que se llama a la función.

Si quieres una nueva cada vez, haz esto:

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

Otros consejos

Esto es simplemente incorrecto. No puede (significativamente) proporcionar un objeto mutable como valor predeterminado en una declaración de función.

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

Debes hacer algo como esto.

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 lista vacía en su definición de función se crea una vez, en el momento en que se crea la función. No se crea cada vez que se llama a la función.

Exactamente. Para solucionar este problema, asigne None en la definición de función y verifique None en el cuerpo de la función:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
        print 'var = %s %s' % (var, id(var))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top