4 Stimmen

Variable Identität mit Python __init__ Funktion - kann jemand erklären?

Ich habe eine Frage zur Klasse init Funktionen in Python. Ich war durcheinander über den Versuch, ein Text-Adventure-Spiel-Typ-Umgebung zu erstellen, mit jedem Raum mit einem "Elemente" Eigenschaft, als Liste gespeichert. Ich versuchte das folgende:

Klassenzimmer:

def __init__(self,items=[]):
    self.items=items

Dabei stelle ich jedoch fest, dass jeder Raum, für den kein Element für die Einleitung definiert wurde, nicht nur eine leere Liste erhält, sondern auch die dieselbe leere Liste. Wenn ich nun eine Reihe von Räumen erstelle und einen Gegenstand an einen von ihnen anhänge, erscheint der Gegenstand in jedem Raum.

Das ist leicht zu beheben (jedem Raum manuell eine leere Liste zuweisen), aber ich verstehe nicht, warum das passiert. Ich könnte mir vorstellen, dass das Anlegen von Raum a eine leere Liste a.items und Raum b eine leere Liste b.items erzeugen würde. Aber kann mir jemand erklären, warum dies identisch sein sollte? Und gibt es eine Möglichkeit, die obige Funktion mit einem Standardwert zu erzeugen, der jedes Mal eine andere Liste erstellt?

Zum Wohl,

Billy.

4voto

Gyscos Punkte 1694

Sie müssen die Standardparameter in Python verstehen. Wenn Sie items=[] schreiben, erstellen Sie eine globale Variable [], die Sie item zuweisen, wenn kein geeigneter Parameter angegeben wird. Das bedeutet, dass jedes Mal, wenn items den Standardwert annimmt, ihm das gleiche []-Objekt zugewiesen wird. (Denken Sie daran, dass Variablen, wie in Java, nur Verweise auf Objekte sind. Alle Variablen von items sind Verweise auf dasselbe Objekt).

Formale Erklärung : http://effbot.org/zone/default-values.htm

Was Sie tun könnten, ist:

def __init__(self, items=None):
    if items is None:
        items = []
    self.items = items

Auf diese Weise wird der Standardwert "Keine" nie geändert. Wenn dieser Wert entdeckt wird, wird eine neue Liste erstellt (diesmal eine echte neue Liste, keine globale).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X