W Pythonie widziałem dwie zmienne wartości zamienione za pomocą tej składni:
left, right = right, left
Czy jest to uważane za standardowy sposób zamiany dwóch wartości zmiennych, czy też istnieją inne sposoby, za pomocą których zwykle dwie zmienne są zwykle zamieniane?
python
syntax
swap
conventions
WilliamKF
źródło
źródło
Odpowiedzi:
Oznacza to, że wyrażenie
a,b = b,a
:b,a
oceniana jest prawa strona , to znaczy krotka dwóch elementów jest tworzona w pamięci. Dwa elementem są obiekty oznaczone identyfikatoramib
ia
, które zostały wcześniej istniejących dyspozycja jest encoutered trakcie realizacji programua
przypisania pierwszego identyfikatora pierwszemu elementowi krotki (czyli obiektowi, który był poprzednio b przed zamianą, ponieważ miał nazwęb
)oraz drugi identyfikator
b
jest przyporządkowana do drugiego elementu krotki (która jest obiektem, który był poprzednio przed wymiany, ponieważ jej identyfikatory było )a
Ten mechanizm skutecznie zamienił obiekty przypisane do identyfikatorów
a
ib
Tak więc, aby odpowiedzieć na twoje pytanie: TAK, jest to standardowy sposób zamiany dwóch identyfikatorów na dwa obiekty.
Nawiasem mówiąc, obiekty nie są zmiennymi, są obiektami.
źródło
a, b, c = c, a, b
.Jest to standardowy sposób zamiany dwóch zmiennych, tak.
źródło
Znam trzy sposoby zamiany zmiennych, ale
a, b = b, a
jest najprostsza. JestXOR (dla liczb całkowitych)
Lub zwięźle
Zmienna tymczasowa
Tuple swap
źródło
code
x = x + yy = xy x = xycode
Nie powiedziałbym, że jest to standardowy sposób zamiany, ponieważ spowoduje nieoczekiwane błędy.
nums[i]
zostanie najpierw zmodyfikowany, a następnie wpłynie na drugą zmiennąnums[nums[i] - 1]
.źródło
var c=a
,a=b
,b=c
. I wtedy ostatnie przypisanie użyje nowej wartościa
do oceny adresu b.nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
. Rozwiązałoby problem.nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
: Problem polega na tym, że Python wykonuje przypisanie po lewej stronie,nums[i]
ulega zmianie, co powodujenums[nums[i] - 1]
nieoczekiwane zmiany. Na początku możesz sobie wyobrazić, że chcesznums[1],nums[2] = nums[2],nums[1]
, ale ponums[1] = nums[2]
biegu już nie masznums[2] = nums[1]
, zamiast tego masznums[888] = nums[1]
.Nie działa w przypadku tablic wielowymiarowych, ponieważ używane są tutaj odniesienia.
Zobacz także Zamień plastry tablic Numpy
źródło
Aby obejść problemy wyjaśnione przez eyquem , możesz użyć
copy
modułu do zwrócenia krotki zawierającej (odwrócone) kopie wartości za pomocą funkcji:Ta sama funkcja jak
lambda
:Następnie przypisz je do żądanych nazw, takich jak to:
UWAGA: jeśli chcesz, możesz zaimportować / użyć
deepcopy
zamiastcopy
.źródło
Możesz łączyć zamiany krotki i XOR : x, y = x ^ x ^ y, x ^ y ^ y
lub
Za pomocą lambda :
Wynik:
źródło