ich bin Neuling in Sachen Python (auch wenn ich mich hier schon vor Jahren angemeldet habe). Sollte ich irgendwie gegen Regeln verstoßen, so ist das ungewollt. Macht mich einfach darauf aufmerksam.
Ich benutze Python 3.4
Ich bin dabei, eine Baumstruktur für mein Projekt zu schreiben. Doch ich habe Schwierigkeiten. Meinen Code habe ich versucht, auf das Problem zu entschlacken:
Code: Alles auswählen
class msgTreeChild:
__id = ""
__val = ""
__parent = None
__childs = []
def __init__(self, ID, val):
self.__val = val
self.__id = ID
def addChild(self, ID, Val):
newChild = msgTreeChild(ID, Val)
self.__childs.append(newChild)
return newChild
def getChildList(self):
return self.__childs
if __name__ == "__main__":
x = msgTreeChild(1, 2)
a = x.addChild(2, 3)
b = x.addChild(3, 1)
c = x.addChild(4, 2)
d = x.addChild(5, 2.5)
# meine Erwartung: x: 4 Kinder, a: 0 Kinder, b: 0 Kinder, c:0, d:0
print("Anzahl der Kinder von a: " + str(len(a.getChildList())))
print(a.getChildList() == b.getChildList())
print(a.getChildList() is b.getChildList())
x = msgTreeChild(1, 2) Es wird eine Instanz der Klasse kreiert und die Methode __init__ wird aufgerufen. Sie weißt der Instanz die Inhalte der Variablen zu.
a = x.addChild(2, 3) Es wird die Methode addChild aufgerufen. Es entspricht quasi:
addChild(self = x, ID = 2, Val = 3).
newChild = msgTreeChild(ID, Val) Es wird eine neue Instanz der Klasse kreiert (damit existieren zwei Instanzen). Die __init__-Methode wird aufgerufen, diese weist die Werte 2,3 den Variablen __id, __val zu.
Der Variablen newChild wird diese neue neue Klasse zugewiesen.
self.__childs.append(newChild) self entspricht x. Es wird also der Liste __childs der ersten Klasse die neue Klasse hinzugefügt.
return newChild Diese neue Klasse wird der Variablen a zugewiesen.
Meinem Verständnis nach müsste ich nun zwei Klassen haben (x und a). x hat in seiner liste __childs einen Eintrag und a hat in seiner Liste __childs kein Element (leere Liste).
Wie ich nun an der Ausgabe der print()-Befehle erkenne, verhält es sich anders, als ich mir das vorstelle.
Kann mir jemand aufzeigen, wo ich den Denkfehler habe? Vielen Dank im Voraus!
Wenn ich a.getChildList() is b.getChildList() == True richtig interpretiere, dann bedeutet das, dass es nur eine Liste "__childs" gibt, und a.__childs sowie b.__childs auf die selbe Instanz verweisen?
Ich bin Euch wirklich dankbar, wenn ihr mir aufzeigt, wo ich das Brett vorm Kopf habe.
Grüße, Ulrich
PS: das mit den Zeilennummern beim Code im Forum habe ich noch rausbekommen: einfach die Code-Tags mit großem "C" beginnen, statt mit kleinem .