Pergunta

Por que faz o seguinte:

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 em:

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

Eu não entendo por que ele não está usando uma nova instância de uma lista ao usar argumentos nomeados opcionais, alguém pode explicar isso?

Foi útil?

Solução

A lista vazia em sua definição de função é criado uma vez que, no momento em que a função em si é criado. Não é criado cada vez que a função é chamada.

Se você quiser um novo a cada vez, faça o seguinte:

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

Outras dicas

Isto é simplesmente errado. Você não pode (significativamente) fornecer um objeto mutável como um valor padrão em uma declaração de função.

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

Você deve fazer algo assim.

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

A lista vazia em sua definição de função é criado uma vez que, no momento em que a função em si é criado. Não é criado cada vez que a função é chamada.

Exatamente. Para contornar este Nenhum int Atribuir ele funcionar definiton e verificar se há nenhum no corpo da função:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
        print 'var = %s %s' % (var, id(var))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top