In Python wurden zwei Variablenwerte mit dieser Syntax ausgetauscht:
left, right = right, left
Wird dies als Standardmethode zum Austauschen von zwei Variablenwerten angesehen, oder gibt es andere Mittel, mit denen zwei Variablen üblicherweise vertauscht werden?
python
syntax
swap
conventions
WilliamKF
quelle
quelle
Antworten:
Das bedeutet für den Ausdruck Folgendes
a,b = b,a
:b,a
wird ausgewertet, dh es wird ein Tupel aus zwei Elementen im Speicher erstellt. Die beiden Elemente sind die Objekte, die durch die Bezeichner gekennzeichnet sindb
unda
die vorhanden waren, bevor der Befehl während einer Programmausführung entdeckt wurdea
dem ersten Element des Tupels zugewiesen wird (das ist das Objekt, das vor dem Tausch formell b war, weil es einen Namen hatteb
)und dem Der zweite Bezeichner
b
wird dem zweiten Element des Tupels zugewiesen (dies ist das Objekt, das früher ein vor dem Tausch war, weil seine Bezeichner warena
).Dieser Mechanismus hat die den Bezeichnern
a
und zugewiesenen Objekte effektiv ausgetauschtb
Um Ihre Frage zu beantworten: JA, es ist die Standardmethode, zwei Bezeichner gegen zwei Objekte auszutauschen.
Die Objekte sind übrigens keine Variablen, sondern Objekte.
quelle
a, b, c = c, a, b
.Das ist die Standardmethode, um zwei Variablen auszutauschen, ja.
quelle
Ich kenne drei Möglichkeiten, Variablen auszutauschen, aber
a, b = b, a
die einfachste. Es gibtXOR (für ganze Zahlen)
Oder kurz gesagt,
Temporäre Variable
Tupeltausch
quelle
code
code
Ich würde nicht sagen, dass dies eine Standardmethode zum Tauschen ist, da dies zu unerwarteten Fehlern führen wird.
nums[i]
wird zuerst geändert und wirkt sich dann auf die zweite Variable ausnums[nums[i] - 1]
.quelle
var c=a
,a=b
,b=c
. Und dann verwendet die letzte Zuweisung den neuen Wert vona
, um die Adresse von b zu bewerten.nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
. Würde das Problem lösen.nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
: Das Problem ist, wenn Python die Zuweisung auf der linken Seite vornimmt,nums[i]
geändert wird, was zunums[nums[i] - 1]
unerwarteten Änderungen führt. Du kannst dir vorstellen , dass du es zuerst willstnums[1],nums[2] = nums[2],nums[1]
, aber nach demnums[1] = nums[2]
Laufen hast du es nicht mehrnums[2] = nums[1]
, stattdessen hast du esnums[888] = nums[1]
.Funktioniert nicht für mehrdimensionale Arrays, da hier Referenzen verwendet werden.
Siehe auch Teile von Numpy-Arrays austauschen
quelle
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:Gleiche Funktion wie
lambda
:Weisen Sie diese dann den gewünschten Namen zu:
HINWEIS: Wenn Sie möchten, können Sie
deepcopy
stattdessen importieren / verwendencopy
.quelle
Sie können Tupel- und XOR- Swaps kombinieren : x, y = x ^ x ^ y, x ^ y ^ y
oder
Mit Lambda :
Ausgabe:
quelle