Dalam Python, saya telah melihat dua nilai variabel bertukar menggunakan sintaks ini:
left, right = right, left
Apakah ini dianggap sebagai cara standar untuk menukar dua nilai variabel atau apakah ada cara lain yang dengannya dua variabel biasanya ditukar?
python
syntax
swap
conventions
WilliamKF
sumber
sumber
Jawaban:
Itu berarti yang berikut untuk ekspresi
a,b = b,a
:b,a
dievaluasi, artinya dua elemen dibuat dalam memori. Dua elemen adalah objek yang ditunjuk oleh pengidentifikasib
dana
, yang ada sebelum instruksi diberikan selama pelaksanaan programa
ditugaskan ke elemen pertama tuple (yang merupakan objek yang sebelumnya b sebelum swap karena memiliki namab
)dan identifier kedua
b
ditugaskan untuk elemen kedua dari tuple (yang merupakan objek yang sebelumnya seorang sebelum swap karena pengidentifikasi nya adalaha
)Mekanisme ini telah secara efektif menukar objek yang ditugaskan untuk pengidentifikasi
a
danb
Jadi, untuk menjawab pertanyaan Anda: YA, itu adalah cara standar untuk bertukar dua pengidentifikasi pada dua objek.
By the way, objek bukan variabel, mereka adalah objek.
sumber
a, b, c = c, a, b
.Itu adalah cara standar untuk menukar dua variabel, ya.
sumber
Saya tahu tiga cara untuk menukar variabel, tetapi
a, b = b, a
paling sederhana. AdaXOR (untuk bilangan bulat)
Atau singkatnya,
Variabel sementara
Tukar swap
sumber
code
= x + yy = xy x = xycode
Saya tidak akan mengatakan itu adalah cara standar untuk bertukar karena akan menyebabkan beberapa kesalahan yang tidak terduga.
nums[i]
akan dimodifikasi terlebih dahulu baru kemudian mempengaruhi variabel keduanums[nums[i] - 1]
.sumber
var c=a
,a=b
,b=c
. Dan kemudian, tugas terakhir akan menggunakan nilai barua
untuk mengevaluasi alamat b.nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
. Akan menyelesaikan masalah.nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
: Masalahnya adalah ketika python melakukan tugas sisi kiri,nums[i]
diubah, yang menyebabkannums[nums[i] - 1]
perubahan tak terduga. Anda dapat membayangkan pada awalnya Anda inginkannums[1],nums[2] = nums[2],nums[1]
, tetapi setelahnums[1] = nums[2]
berlari, Anda tidak lagi memilikinyanums[2] = nums[1]
, sebaliknya Anda mendapatkannyanums[888] = nums[1]
.Tidak berfungsi untuk array multidimensi, karena referensi digunakan di sini.
Lihat juga Swap irisan array Numpy
sumber
Untuk mengatasi masalah yang dijelaskan oleh eyquem , Anda dapat menggunakan
copy
modul untuk mengembalikan tuple yang berisi salinan nilai yang dibalik, melalui fungsi:Fungsi yang sama dengan
lambda
:Kemudian, tetapkan itu ke nama yang diinginkan, seperti ini:
CATATAN: jika Anda ingin, Anda bisa mengimpor / menggunakan
deepcopy
alih-alihcopy
.sumber
Anda dapat menggabungkan tuple dan XOR swap: x, y = x ^ x ^ y, x ^ y ^ y
atau
Menggunakan lambda :
Keluaran:
sumber