it-swarm.com.de

Gibt es eine standardisierte Methode, um zwei Variablen in Python auszutauschen?

In Python habe ich zwei Variablenwerte gesehen, die mit dieser Syntax vertauscht wurden:

left, right = right, left

Wird dies als Standardmethode zum Austauschen von zwei Variablenwerten angesehen, oder gibt es andere Methoden, mit denen normalerweise zwei Variablen ausgetauscht werden?

299
WilliamKF

Python wertet Ausdrücke von links nach rechts aus. Beachten Sie, dass bei der Auswertung einer Aufgabe die rechte Seite vor der linken Seite ausgewertet wird.

http://docs.python.org/3/reference/expressions.html#evaluation-order

Das heißt für den Ausdruck a,b = b,a:

  • die rechte Seite b,a wird ausgewertet, dh es wird ein Tupel aus zwei Elementen im Speicher angelegt. Die beiden Elemente sind die durch die Bezeichner b und a bezeichneten Objekte, die vor dem Erkennen der Anweisung während einer Programmausführung vorhanden waren
  • kurz nach der Erstellung dieses Tupels wurde noch keine Zuordnung zu diesem Tupel-Objekt vorgenommen, aber es spielt keine Rolle, Python weiß intern, wo es sich befindet
  • dann wird die linke Seite ausgewertet, dh der Tupel wird der linken Seite zugeordnet
  • da die linke Seite aus zwei Bezeichnern besteht, wird der Tupel entpackt, damit der erste Bezeichner a dem ersten Element des Tupels zugewiesen wird (das ist das Objekt, das ursprünglich war ) b vor dem Tausch, weil er den Namen b hatte)
    und der zweite Bezeichner b werden dem zweiten Element des Tupels zugewiesen (das ist das Objekt, das zuvor ein vor dem Tausch war, weil seine Bezeichner war a)

Dieser Mechanismus hat die den Bezeichnern a und b zugewiesenen Objekte effektiv ausgetauscht.

Um Ihre Frage zu beantworten: JA, dies ist die Standardmethode, um zwei Bezeichner gegen zwei Objekte auszutauschen.
Übrigens sind die Objekte keine Variablen, sie sind Objekte.

344
eyquem

Das ist die Standardmethode, um zwei Variablen auszutauschen, ja.

104
Martijn Pieters

Ich kenne drei Möglichkeiten, um Variablen auszutauschen, aber a, b = b, a ist die einfachste. Es gibt

XOR (für ganze Zahlen)

x = x ^ y
y = y ^ x
x = x ^ y

Oder kurz gesagt,

x ^= y
y ^= x
x ^= y

Temporäre Variable

w = x
x = y
y = w
del w

Tupel-Tausch

x, y = y, x
33
NoOneIsHere

Ich würde nicht sagen, dass dies eine Standardmethode zum Austauschen ist, da dies zu unerwarteten Fehlern führt.

nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]

nums[i] wird zuerst geändert und wirkt sich dann auf die zweite Variable nums[nums[i] - 1] aus.

16
Yi Huang

Funktioniert nicht für mehrdimensionale Arrays, da hier Referenzen verwendet werden.

import numpy as np

# swaps
data = np.random.random(2)
print(data)
data[0], data[1] = data[1], data[0]
print(data)

# does not swap
data = np.random.random((2, 2))
print(data)
data[0], data[1] = data[1], data[0]
print(data)

Siehe auch Swap Slices von Numpy Arrays

4
gizzmole

Um die durch eyquem erklärten Probleme zu umgehen, können Sie mit dem copy -Modul über eine Funktion ein Tupel zurückgeben, das (umgekehrte) Kopien der Werte enthält:

from copy import copy

def swapper(x, y):
  return (copy(y), copy(x))

Gleiche Funktion wie ein lambda:

swapper = lambda x, y: (copy(y), copy(x))

Weisen Sie diese dann wie folgt den gewünschten Namen zu:

x, y = swapper(y, x)

HINWEIS: Wenn Sie möchten, können Sie deepcopy anstelle von copy importieren/verwenden.

0
LogicalBranch