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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage