Einfache Python-Swap-Funktion

8

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.

%Vor%

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

%Vor%

Es wird ein Verweis auf die Kopie von s1 statt s1 selbst sein. Kann jemand eine bessere Erklärung anbieten? Danke.

    
Rhs 31.10.2012, 20:57
quelle

7 Antworten

18

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.

    
Thomas 31.10.2012, 21:00
quelle
10

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!

    
inspectorG4dget 31.10.2012 21:02
quelle
4

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

    
Zero Piraeus 31.10.2012 21:09
quelle
3

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.

    
mgilson 31.10.2012 21:00
quelle
1

Hier ist eine einzeilige Funktion, die Ihr Ziel erreicht:

%Vor%     
yeshua 08.06.2016 14:32
quelle
1

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:

%Vor%

Die Ausgabe wird a = 9 and b = 5

sein

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 ~

verwenden

Code:

%Vor%

So wird Ausgabe [1, 3, 5, 7, 11, 13]

sein     
Devil-oper 18.07.2017 18:37
quelle
0

yo kann folgendes haben:

%Vor%     
Er.Ellison 18.03.2018 21:21
quelle

Tags und Links