Frage

Warum funktioniert wie folgt vor:

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

Ergebnis in:

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

Ich verstehe nicht, warum es nicht eine neue Instanz einer Liste zu verwenden, wenn optionales Schlüsselwort Argumente verwendet wird, kann das jemand erklären?

War es hilfreich?

Lösung

Die leere Liste in der Funktionsdefinition wird einmal, um die Funktion zu dem Zeitpunkt erstellt selbst erstellt wird. Es wird nicht jedes Mal die Funktion erstellt aufgerufen wird.

Wenn Sie einen neuen jedes Mal wollen, dies tun:

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

Andere Tipps

Das ist einfach falsch. Sie können nicht (sinnvoll) in einer Funktionsdeklaration ein veränderbares Objekt als Standardwert angeben.

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

Sie müssen etwas tun.

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

Die leere Liste in der Funktionsdefinition wird einmal, um die Funktion zu dem Zeitpunkt erstellt selbst erstellt wird. Es wird nicht jedes Mal die Funktion erstellt aufgerufen wird.

Genau. Umgehen dieses zuweisen Keine int er Funktion definiton und prüfen, ob keine in der Funktionskörper:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
        print 'var = %s %s' % (var, id(var))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top