Initialisering av søkeord args i Python

stemmer
0

Hvorfor gjør følgende:

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

resultere i:

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

Jeg forstår ikke hvorfor det ikke bruker en ny forekomst av en liste når du bruker valgfrie søkeord argumenter, kan noen forklare dette?

Publisert på 05/05/2009 klokken 13:47
kilden bruker
På andre språk...                            


3 svar

stemmer
6

Den tom liste i funksjonsdefinisjonen er opprettet en gang, på den tiden selve funksjonen er opprettet. Det er ikke opprettet hver gang funksjonen kalles.

Hvis du vil ha en ny hver gang, gjør du dette:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
Svarte 05/05/2009 kl. 13:51
kilden bruker

stemmer
2

Dette er rett og slett feil. Du kan ikke (menings) gir en foranderlig objekt som standardverdi i en funksjon erklæring.

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

Du må gjøre noe som dette.

class A(object):
    def __init__(self, var=None):
        self._var = var if var is not None else []
        print 'var = %s %s' % (var, id(var))
Svarte 05/05/2009 kl. 13:52
kilden bruker

stemmer
1

Den tom liste i funksjonsdefinisjonen er opprettet en gang, på den tiden selve funksjonen er opprettet. Det er ikke opprettet hver gang funksjonen kalles.

Nøyaktig. For å omgå dette tildele Ingen int han funksjon definiton og se etter Ingen i funksjon kroppen:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
        print 'var = %s %s' % (var, id(var))
Svarte 05/05/2009 kl. 13:55
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more