2017-03-28 1 views
-1

Fragen Sie sich einfach, wie der nächste Knoten in der __str__-Methode korrekt angezeigt wird. Siehe den folgenden Code und die Ergebnisse. Es sieht so aus, als ob es eine eingebaute rekursive Natur gibt, die die __str__ Methoden für jeden Knoten in der Liste verkettet. Könnte jemand erklären, warum und wie ich es normal verhalten kann, wie nur die Adresse des nächsten Knotens drucken. Vielen Dank.Warum druckt die Methode __str__ die Knoten rekursiv in einer verketteten Liste?

class Node(object): 
    def __init__(self, x): 
     self.val = x 
     self.next = None 
    def __str__(self): 
     return "Node {}, next is {}".format(self.val, self.next) 

a = Node(1) 
b = Node(2) 
c = Node(3) 
a.next = b 
b.next = c 
print(a) 
Node 1, next is Node 2, next is Node 3, next is None 
+0

Warum sollte 'print (a)' und 'Format (self.next)' tun zwei verschiedene Dinge? –

+0

Wenn Sie "self.next" an "format" übergeben, sagen Sie ihm, dass er eine String-Repräsentation von 'self.next' in die Ergebniszeichenfolge einfügen soll. Hey, schau mal, 'self.next' hat eine' __str__' Methode um eine String Repräsentation davon zu erhalten! – user2357112

Antwort

0

Der Grund dies alles druckt die Knoten weil .format ist wandle jede Eingabe in eine Zeichenkette um, bevor sie verkettet wird. Dazu ruft es die Methode __str__ des nächsten Knotens auf und der Zyklus wird fortgesetzt.

Es gibt zwei Möglichkeiten, damit es so funktioniert, wie Sie es möchten. In der __str__ Methode können Sie die __repr__, !r anrufen, oder Sie können den Speicherort manuell mit ID und formatieren Sie es wie Sie wollen.

return "Node {}, next is {!r}".format(self.val, self.next) 
# or 
return "Node {}, next is <__main__.Node object at {}>".format(self.val, hex(id(self.next))) 

Beides Ergebnis in der gleichen Ausgabe:

Node 1, next is <__main__.Node object at 0x1005d7fd0> 
1

Statt self.next ‚s str Darstellung von Druck, versuchen seine Drucken repr statt:

return "Node {}, next is {!r}".format(self.val, self.next) 

Ergebnis:

Node 1, next is <__main__.Node object at 0x7f9f10066630> 
Verwandte Themen