Initialisierung von Keyword-args in Python
-
05-07-2019 - |
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?
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))