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?

È stato utile?

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))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top