Python-Konstruktor macht seltsame Dinge mit optionalen Parametern [duplizieren]
Mögliches Duplizieren:
Wenig Erstaunen in Python: das veränderbare Standardargument
ch möchte das Verhalten und die Auswirkungen des Pythons verstehe__init__
Konstrukteur. Wenn ein optionaler Parameter vorhanden ist und Sie versuchen, ein vorhandenes Objekt auf ein neues Objekt festzulegen, wird der optionale Wert des vorhandenen Objekts beibehalten und kopiert.
Schauen Sie sich ein Beispiel an:
Im folgenden Code versuche ich, eine Baumstruktur mit Knoten und möglicherweise vielen Kindern zu erstellen. In der ersten KlasseNodeBad
, der Konstruktor hat zwei Parameter, den Wert und mögliche untergeordnete Elemente. Die zweite KlasseNodeGood
nimmt nur den Wert des Knotens als Parameter. Beide haben einaddchild
-Methode zum Hinzufügen eines untergeordneten Elements zu einem Knoten.
Beim Anlegen eines Baumes mit demNodeGood
Klasse, es funktioniert wie erwartet. Wenn Sie jedoch dasselbe mit demNodeBad
Klasse, es scheint, als ob ein Kind nur einmal hinzugefügt werden kann!
Der folgende Code führt zur folgenden Ausgabe:
Good Tree
1
2
3
[< 3 >]
Bad Tree
1
2
2
[< 2 >, < 3 >]
Que Pasa?
Hier ist das Beispiel:
#!/usr/bin/python
class NodeBad:
def __init__(self, value, c=[]):
self.value = value
self.children = c
def addchild(self, node):
self.children.append(node)
def __str__(self):
return '< %s >' % self.value
def __repr__(self):
return '< %s >' % self.value
class NodeGood:
def __init__(self, value):
self.value = value
self.children = []
def addchild(self, node):
self.children.append(node)
def __str__(self):
return '< %s >' % self.value
def __repr__(self):
return '< %s >' % self.value
if __name__ == '__main__':
print 'Good Tree'
ng = NodeGood(1) # Root Node
rootgood = ng
ng.addchild(NodeGood(2)) # 1nd Child
ng = ng.children[0]
ng.addchild(NodeGood(3)) # 2nd Child
print rootgood.value
print rootgood.children[0].value
print rootgood.children[0].children[0].value
print rootgood.children[0].children
print 'Bad Tree'
nb = NodeBad(1) # Root Node
rootbad = nb
nb.addchild(NodeBad(2)) # 1st Child
nb = nb.children[0]
nb.addchild(NodeBad(3)) # 2nd Child
print rootbad.value
print rootbad.children[0].value
print rootbad.children[0].children[0].value
print rootbad.children[0].children