Inizializzazione di parole chiave arg in Python
-
05-07-2019 - |
Domanda
Perché è il seguente:
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()
risulta in:
var = [] 182897439952
var = ['one'] 182897439952
Non capisco perché non stia utilizzando una nuova istanza di un elenco quando si usano argomenti di parole chiave opzionali, qualcuno può spiegarlo?
Soluzione
L'elenco vuoto nella definizione della funzione viene creato una volta, nel momento in cui viene creata la funzione stessa. Non viene creato ogni volta che viene chiamata la funzione.
Se ne vuoi uno nuovo ogni volta, fai questo:
class A(object):
def __init__(self, var=None):
if var is None:
var = []
self._var = var
Altri suggerimenti
Questo è semplicemente sbagliato. Non è possibile (significativamente) fornire un oggetto mutabile come valore predefinito in una dichiarazione di funzione.
class A(object):
def __init__(self, var=[]):
self._var = var
print 'var = %s %s' % (var, id(var))
Devi fare qualcosa del genere.
class A(object):
def __init__(self, var=None):
self._var = var if var is not None else []
print 'var = %s %s' % (var, id(var))
L'elenco vuoto nella definizione della funzione viene creato una volta, nel momento in cui viene creata la funzione stessa. Non viene creato ogni volta che viene chiamata la funzione.
Esattamente. Per aggirare questo compito, assegnare Nessuno nella funzione definiton e controllare Nessuno nel corpo della funzione:
class A(object):
def __init__(self, var=None):
if var is None:
var = []
self._var = var
print 'var = %s %s' % (var, id(var))