Swap die 2 Werte von 2 Variablen ohne eine Dritte variable; python
So, ein Freund von mir fragte, wie mein python-Programmierung zu kommen; ich sagte, dass ich eine Menge zu lernen und, dass Sie es war kommt gut voran. Dann mein Freund, ein Mathematik-snob, der mich fragt:
"Können Sie die swap-Wert von 2 Variablen ohne eine Dritte variable als temporäre Platzhalter?"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den kanonischen Weg zu tauschen zwei Variablen in Python ist
Bitte beachten Sie als das gilt, was der "Typ" von
a
oderb
ist (numeric, string, Tupel, Objekt, ...). Natürlich, es funktioniert auch, wenn beide Variablen referenzieren Werte verschiedener Typen.Als viele imperativen Sprachen, Python wertet Zuweisungen von rechts nach Links. Konzeptionell Verhalten sich alle wie wenn ein Tupel wurde zu bauen, für den rechten Teil des Ausdrucks, und dann dekonstruiert durchführen, die Beeinträchtigung der linken hand Teil. Dieser hat bereits erklärt, mehr als deutlich kann ich hier: https://stackoverflow.com/a/14836456/2363712
Die wirklichen details sind implementierungsabhängig obwohl. Zum Beispiel, um zu bauen auf ein Kommentar von @undefined ist nicht eine Funktion unten, der CPython virtuelle Maschine hat eine ROT_TWO opcode, die tauschen die beiden top-level-Elemente auf dem stack, und damit zu optimieren solche Allüren. Siehe diesen früheren Antwort eine ausführliche Erklärung: https://stackoverflow.com/a/21047622/2363712
Dies ist der Haupt-code-snippet
Dies ist, was Ihr Freund meinte
Wenn Ihr Freund ist ein "Mathe-snob", mag er im Kopf haben einen besonderen trick, die Sie verwenden können, in den Sprachen, wo Sie können anwenden der XOR-Funktion der bitstring-Darstellung von zahlen.
Sagen, wir haben die Variablen X und Y, beginnend mit Werten von eine und b beziehungsweise. Führen Sie die folgenden Aufgaben (die Werte der Variablen, der das Ergebnis angezeigt werden als Kommentare):
Da XOR ist assoziativ, wir können gruppiert die resultierenden Gleichungen wie folgt:
Weil x XOR x == 0 und x XOR 0 == x, wir können einfach entfernen Sie alle Paare von Variablen mit XOR verknüpft, mit sich selbst, und was übrig bleibt, ist:
ist das, was wir wollten, wechseln die Werte ohne Verwendung einer Dritten Variablen.
Es ist eine Weile da ich leider keine bit-manipulation in Python, so dass ich kann Ihnen nicht sagen, ob dieser trick funktioniert auch in Python, aber es gibt Sprachen, wo es funktioniert. Ich kann auch nicht sagen, ob es tatsächlich ausreichend Vorteile für den Ausgleich Ihrer nicht-Offensichtlichkeit.
können Sie auch direkt versuchen,
Einen kanonischen Weg, um exchange den Wert ohne Verwendung der Dritten Variablen.
Einem scheinbar einfachen Frage. Im Nachhinein betrachtet, vermutlich entwickelt, um zu bestimmen, ob oder nicht du denkst mathematisch. Ich überlegte, es ist nicht ein einfaches problem, aber nicht außer Reichweite.
Als Forschung zeigt, dies ist eine ziemlich häufige Frage, die mit vielen gut und schlecht Antworten. Ich glaube, ich habe gefunden eine anschauliche Lösung:
Zwar gibt es einige unnötige Wiederholungen, die Logik ist solide. Baseline:
1) Es funktioniert mit allen ganzen zahlen sowohl positive als auch negative; habe ich noch nicht getestet schwimmt noch.
2) Der gleiche Speicher benutzt wird 1 oder andere Weise; nur 2 Variablen verwendet werden, so oder so.
3) Portabilität ist (oder sollte) immer ein Ziel. In dem Fall, dass Programmiersprachen gehen Weg, und Sie brauchen, um Anschluss zu einem neuen, Forschung zeigt, dass der Umgang mit diesem problem mathematisch wird eine größere Portabilität.
In das "schlechte" Beispiel, diese Methode ist sprachspezifisch und die Portierung von einer Sprache würde (irgendwann) erfordern eine andere Lösung. Ich hoffe, dass Python geht nie den Weg des COBOL-aber die Zukunft ist groß.
Jedoch in den "guten" Beispiel der Mathematik wird in ähnlicher Weise behandelt, in der C-Sprache. In der Tat, Forschung zeigt auch, Mathe ist in der Regel auf die gleiche Weise behandelt in den meisten Sprachen.
Deshalb verlässt die Mathematik in Takt und nur Verhandlungen über die syntax-änderung ist, desto mehr tragbare Methode.
Irgendwann werde ich zugeben, dass mein Freund, dass dies war eine gute Gelegenheit zum lernen für mich. Aber nicht für eine Weile. Ich fand die Antwort, scheiterte aber durch Betrug mit der Forschung.
TT
left, right = right, left
wird als eine "schlechte Antwort"? So wie ich das verstehe, ist die Frage "Python-orientierte" -- also warum nicht die Sprache Idiome, um Probleme zu lösen.0.0000001
und1000000
gibt falsche Ausgabe. Und ich bin mir nicht wirklich sicher, warum Sie erwähnten Zeichenfolgen; es ist definitiv nicht die Arbeit mit Ihnen (Sie haben keine Subtraktion-operator definiert).(1000000.0, 1.00000761449337e-07)
. Das ist nicht nur der exponent output, gibt ' s eine andere Nummer ,bevor diee
. Wie wäre es damit: versuchen0.3
und1.0
. Dass die Ergebnisse in(1.0, 0.30000000000000004)
. Das ist eine andere Nummer.0.000000100000761449337
unterscheidet sich von0.0000001
, kann ich dir nicht helfen.1e10
und1e-10
. Ich bekomme die Ausgabe(0.0, 10000000000.0)
swapNosC
keine Umbauten an alle, und arbeitet für buchstäblich jedes paar von Python-Werten.swapNosC(1e10, 1e-10)
ist, wird der Ausgang(1e-10, 10000000000.0)
. Die syntaxa,b = b,a
buchstäblich hat aber absolut nichts mit der Schalter, der name bezieht sich auf die Wert.swapNosL(1e10, 1e-10)
Ausgänge(0.0, 10000000000.0)
.0!=1e-10
, so dass Sie Verhalten sich anders, und falsch.