Inicialização de argumentos de palavra-chave em Python
-
05-07-2019 - |
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?
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))