Python-Liste sollte leer sein, auf die Klasse-Instanz-Initialisierung, aber das ist es nicht. Warum?
Möchte ich Sie zum erstellen von Instanzen einer Klasse enthält ein Liste ist standardmäßig leer; statt der später die Einstellung in dieser Liste die endgültige Liste möchte ich sukzessive Elemente hinzufügen. Hier ein Stück Beispielcode illustriert dies:
#!/usr/bin/python
class test:
def __init__(self, lst=[], intg=0):
self.lista = lst
self.integer = intg
name_dict = {}
counter = 0
for name in ('Anne', 'Leo', 'Suzy'):
counter += 1
name_dict[name] = test()
name_dict[name].integer += 1
name_dict[name].lista.append(counter)
print name, name_dict[name].integer, name_dict[name].lista
Bei mir lief das Programm erwartet, dass ich bekommen
Anne 1 [1]
Leo 1 [2]
Suzy 1 [3]
als ich angenommen lista
immer initialisiert werden, um eine leere Liste.
Was ich bekam, war vielmehr dies:
Anne 1 [1]
Leo 1 [1, 2]
Suzy 1 [1, 2, 3]
Wenn ich ersetzen self.lista = lst
durch self.lista = []
es funktioniert gut, genau wie wenn ich die Zeile hinzufügen name_dict[name].lista = []
zu der for-Schleife.
Warum ist es, dass die Inhalte der bisherigen Objekte, Listen beibehalten werden, aber Ihre Werte integer
nicht? Ich bin ziemlich neu in Python, also wäre es toll, wenn jemand darauf hinweisen könnte, wo mir meine Gedanken/Annahmen in die Irre gegangen.
Vielen Dank im Voraus für Ihre Antworten.
- möglich, Duplikat der "Mindestens Erstaunen", in Python: Die Veränderliche Default-Argument
- Danke für den link; ich habe für ihn zu suchen, aber offensichtlich habe ich das falsch aufgeschnappt keywords.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine sehr schlechte Idee, ein veränderliches Objekt als default-Wert, wie Sie hier tun:
Ändern Sie diese:
Dem Grund, dass Ihre version nicht funktioniert, ist, dass die leere Liste erstellt wird, nur einmal, wenn die Funktion definiert ist, nicht jedes mal die Funktion aufgerufen wird.
In einigen Python-Implementierungen können Sie den Wert des default-Werte der Funktion, indem Sie den Wert von
func_defaults
:Ausgabe:
Das problem liegt in dieser Zeile:
Sollten Sie nicht verwenden Sie eine Liste als Standard-argument. Das erste mal
__init__
aufgerufen, ohnelst
angegeben, ist der Python-interpreter definieren wird eine leere Liste[]
. Nachfolgende Aufrufe der Funktion funktionieren auf der gleichen Liste, wennlst
ist nicht angegeben, ohne die Deklaration einer neuen Liste. Dies verursacht seltsame Probleme.Sollten Sie stattdessen ein default-Wert von
None
und fügen Sie einen Scheck an den Anfang der Funktion:Sehen dieser Beitrag für weitere details. Zitat aus dem post:
Liegt das problem mit dem default-Konstruktor-argument. Sollten Sie diese Frage finden Sie Antwort auf Ihre Frage: "Least Astonishment" in Python: Die Veränderliche Default-Argument
Python wertet die Standard-Argumente einmal auf Funktion definition:
gibt
Also deine Liste wird einmal definiert. Verwenden Sie die gleiche Liste wie zuvor. Dies ist, warum Sie verwenden sollten Sie das Muster