Ich stieß auf dieses Problem, als ich versuchte, Python zu lernen. Betrachten Sie die folgende Funktion:
%Vor%Was werden s1 und s2 ausgeben?
Nach dem Ausführen des Problems habe ich festgestellt, dass die print-Anweisung 1 2 druckt. Es scheint, dass sich der Wert von s1 und s2 nicht von der Funktion swap0
geändert hat. Die einzige Erklärung, an die ich denken konnte, war wegen der Linie.
Da s1 [:] eine Kopie ist, ist es sinnvoll, dass sich der Wert von s1 im Funktionsaufruf nicht ändert. Da der Parameter swap0
jedoch (s1, s2) ist, bin ich mir nicht sicher, ob ich tmp = s1 [:] tue. Immer wenn ich es tue
Es wird ein Verweis auf die Kopie von s1 statt s1 selbst sein. Kann jemand eine bessere Erklärung anbieten? Danke.
Dies liegt daran, dass es s1
und s2
innerhalb der Funktion swap0
neue Werte zuweist. Diese Zuordnungen werden nicht außerhalb der Funktion weitergegeben. Sie werden sehen, dass es funktioniert, wenn Sie nur den Funktionskörper an die Stelle des Funktionsaufrufs kopieren und einfügen.
Sie können dies umgehen, indem Sie die von den Argumenten referenzierten Objekte und nicht die Argumente selbst ändern:
%Vor%Der einfachste und bessere Weg, um in Python einen Swap zu machen, ist jedoch einfach:
%Vor%Auch dies wird nur diese bestimmten Verweise auf die Listen vertauschen, aber nicht den Inhalt der Liste selbst.
Wie es ist, wird Ihr endgültiges print
die ursprünglichen Werte von s1
und s2
ausgeben. Dies liegt daran, dass Sie sie nur im Rahmen der Funktion austauschen. Dies wirkt sich nicht auf ihre Werte außerhalb der Funktion aus (d. H. Nach ihren Werten nach dem Aufruf der Funktion)
Wenn es sich um änderbare Typen handelt ( list
, set
, dict
usw.), können Sie sie direkt in swap
ändern. Dies beschränkt jedoch swap
nur auf veränderbare Typen.
Es ist daher besser, die Eingaben in umgekehrter Reihenfolge zu senden:
%Vor%Natürlich können Sie dies alles wie folgt in einer Zeile tun:
%Vor%Prost!
Die anderen Antworten erklären, was falsch läuft. Hier ist eine Version, die das macht, was Sie wollen:
%Vor%Siehe auch: isinstance vs. type
Innerhalb der Funktion binden Sie lokale Variablen s1
und s2
mit den Werten auf der rechten Seite (die ebenfalls lokal sind, da Sie zum Erstellen von Kopien Slices verwenden) . Selbst wenn Sie den Inhalt dieser lokalen Variablen ändern, ändern Sie nicht den Inhalt der Listen im aufrufenden Bereich, da sie nicht mehr auf dieselben Listen verweisen.
Sie können dies auch mit der alten Methode zum Verschieben tun, indem Sie Indexierung und Schleife verwenden, wenn beide Listen dieselbe Länge haben. Dies ist eine Art alte Schule, wird aber helfen, die Indizierung zu verstehen
%Vor%
Dies gibt die Ausgabe als:
%Vor%
Oder es kann auch mit Xor gemacht werden. Xor-Operator ist ein bitweiser Operator, der zum Beispiel die Xor-Operation zwischen den Operanden durchführt.
%Vor% Hier ist 0b101
eine binäre Repräsentation von 5 und 0b100
ist eine binäre Repräsentation von 4 und wenn Sie Xor verwenden, erhalten Sie die Ausgabe als 0b001
i.d. Xor gibt 1 Ausgang zurück, wenn nur einer der Eingänge zu 1 ist. Wenn beide Eingänge 0 sind oder beide 1 sind, wird 0 ausgegeben.
Wir können zwei Variablen mit Xor austauschen, zB:
Die Ausgabe wird a = 9 and b = 5
Gleichermaßen können wir auch zwei Listen austauschen, indem wir eine Xor-Operation für die Elemente ausführen, zB:
%Vor%Ausgabe:
%Vor% Nehmen wir ein anderes Szenario, Was ist, wenn wir die Elemente innerhalb der Liste tauschen müssen für zB:
Wir haben eine Liste wie diese x = [ 13, 3, 7, 5, 11, 1 ]
und wir müssen ihren Artikel wie folgt tauschen x = [ 1, 3, 5, 7 , 11, 13 ]
Also können wir dies tun, indem wir zwei bitweise Operatoren Xor ^
und Compliments ~
Code:
%Vor% So wird Ausgabe [1, 3, 5, 7, 11, 13]