2009-05-14 4 views
0

J'ai une méthode qui crée un nouveau nœud dans un arbre - soit à gauche ou à droite. Si la valeur est inférieure à ma valeur actuelle, elle est insérée à gauche, sinon à droite.Pointeurs en Python sur des variables avec aucune valeur

Je veux refactoriser ce code, de sorte que je vois d'abord sur quel côté je dois insérer mon élément, puis l'insérer. Avant je l'ai mis en œuvre deux fois: Une fois pour le côté gauche et une fois pour le côté droit.

Il ressemble actuellement à ceci:

def neu(self, sortByValue, secondValue): 
    child = self.left if(sortByValue.lower() < self.value[0].lower()) else self.right 

    if(child == None): 
     child = MyTree(sortByValue,secondValue) 
    else: child.neu(sortByValue,secondValue) 

Mon problème est, cependant, que self.left est None, et self.right est Aucun. Donc, quand je crée un enfant en tant que variable et que je le mets à MyTree (...), self.left et self.right ne reçoivent pas la valeur.

Y at-il quelque chose que je peux faire pour améliorer cela? Merci!

+1

Vous devriez vraiment travailler sur vos conventions de codage, voir PEP 8. – nikow

+0

Avoir de la difficulté à travailler sur ce que vous essayez d'accomplir. Que voulez-vous dire "self.left et self.right ne reçoivent pas la valeur"? Si vous pouviez reformuler votre problème spécifique, cela pourrait nous aider à comprendre. – akent

+0

D'accord, c'est déconcertant. Pourriez-vous poster plus de code? Vous devez inclure suffisamment de votre classe pour que quelqu'un puisse réellement exécuter votre code. –

Répondre

2

Dans les variables Python, les noms ne sont pas des emplacements. Par exemple:

>>> a = 1 
>>> b = a 
>>> a = 2 
>>> print b 
1 

Dans votre code, vous êtes reconsolidation simplement le nom child à une valeur différente (votre nouveau noeud) et qui n'a pas d'effet sur la valeur liée précédemment (Aucun).

est ici un remaniement de votre code qui devrait faire ce que vous voulez (non testé):

def neu(self, sortByValue, secondValue): 
    def child(node): 
     if(node is None): 
      return MyTree(sortByValue, secondValue) 
     else: 
      child.neu(sortByValue, secondValue) 
      return node 

    if(sortByValue.lower() < self.value[0].lower()): 
     self.left = child(self.left) 
    else: 
     self.right = child(self.right) 
0

Hallo ;-)

self.left ou self.right ne reçoivent pas la valeur parce que vous attribuez à child qui ne contient qu'une copie de la valeur de destination et aucune référence à celle-ci.

Vous voulez avoir un pointeur - Cela n'existe pas directement dans Python.

Vous pouvez l'exprimer en utilisant un wrapper de classe, mais je pense que c'est plus compréhensible lorsque vous écrivez simplement les deux possibilités dans la clause if.

+0

Si j'écrivais les deux cas dans la clause if, j'aurais une répétition de code dans cette méthode. Ce n'est pas une très bonne pratique de codage, puisque je devrais maintenir pratiquement le même code deux fois. –

0

Pourquoi utilisez-vous un arbre?

J'utiliser un dictionnaire:

Initialisation:

arbre = {}

Ajout d'un nouveau nœud:

arbre [sortByValue] = SecondValue

choses Extraction

print arbre [sortByValue]

Pas la réponse directe, mais d'une manière plus pythonique de le faire

+0

Eh bien, il s'agit d'une affectation en classe informatique. Nous avons un répertoire complet qui comprend plusieurs instances d'une classe particulière. Chaque classe a deux propriétés: gauche et droite, où vous pouvez stocker une autre instance de cette classe. De cette façon, nous pouvons construire et trier ce répertoire par les noms des personnes, par exemple, lors de l'ajout d'un élément. –

Questions connexes