Saya baru mengenal python jadi pertanyaan ini mungkin sedikit mendasar. Saya memiliki tupel yang disebut values
yang berisi yang berikut ini:
('275', '54000', '0.0', '5000.0', '0.0')
Saya ingin mengubah nilai pertama (yaitu 275
) dalam tupel ini, tetapi saya memahami bahwa tupel tidak dapat diubah sehingga values[0] = 200
tidak akan berfungsi. Bagaimana saya bisa mencapai ini?
Jawaban:
Pertama, Anda perlu bertanya, mengapa Anda ingin melakukan ini?
Tapi itu mungkin melalui:
Tetapi jika Anda ingin mengubah sesuatu, Anda mungkin lebih baik menyimpannya sebagai file
list
sumber
Bergantung pada masalah Anda, mengiris bisa menjadi solusi yang sangat rapi:
Hal ini memungkinkan Anda untuk menambahkan beberapa elemen atau juga untuk mengganti beberapa elemen (terutama jika mereka adalah "tetangga". Dalam kasus di atas, casting ke daftar mungkin lebih tepat dan dapat dibaca (meskipun notasi pemotongan jauh lebih pendek).
sumber
Nah, seperti yang telah ditunjukkan Trufa, pada dasarnya ada dua cara untuk mengganti elemen tupel pada indeks tertentu. Ubah tupel menjadi daftar, ganti elemen dan ubah kembali, atau buat tupel baru dengan penggabungan.
Jadi, metode mana yang lebih baik, yaitu lebih cepat?
Ternyata untuk tupel pendek (pada Python 3.3), penggabungan sebenarnya lebih cepat!
Namun jika kita melihat tupel yang lebih panjang, konversi daftar adalah cara yang harus dilakukan:
Untuk tupel yang sangat panjang, konversi daftar jauh lebih baik!
Selain itu, kinerja metode penggabungan bergantung pada indeks tempat kita mengganti elemen. Untuk metode daftar, indeks tidak relevan.
Jadi: Jika tupel Anda pendek, potong dan gabungkan. Jika sudah lama, lakukan konversi daftar!
sumber
Ini dimungkinkan dengan satu liner:
sumber
values
dengan ini?i = 2; values = (*values[:i], '300', *values[i+1:])
Bukan berarti ini lebih unggul, tetapi jika ada yang penasaran dapat dilakukan dalam satu baris dengan:
sumber
tuple = tuple(200 if i == 0 else _ for i, _ in enumerate(tuple))
? (Mengapa tidak pemahaman generator?)Saya yakin ini secara teknis menjawab pertanyaan, tetapi jangan lakukan ini di rumah. Saat ini, semua jawaban melibatkan pembuatan tupel baru, tetapi Anda dapat menggunakannya
ctypes
untuk memodifikasi tupel dalam memori. Mengandalkan berbagai detail implementasi CPython pada sistem 64-bit, salah satu cara untuk melakukannya adalah sebagai berikut:sumber
Seperti yang ditulis Hunter McMillen di komentar, tupel tidak dapat diubah, Anda perlu membuat tupel baru untuk mencapai ini. Misalnya:
sumber
EDIT: Ini tidak berfungsi pada tupel dengan entri duplikat !!
Berdasarkan ide Pooya :
Jika Anda berencana untuk sering melakukan ini (yang seharusnya tidak Anda lakukan karena tuple tidak dapat diubah karena suatu alasan), Anda harus melakukan sesuatu seperti ini:
Atau berdasarkan ide Jon :
sumber
Frist, tanyakan pada diri sendiri mengapa Anda ingin memutasi file
tuple
. Ada alasan mengapa string dan tuple tidak dapat diubah di Ptyhon , jika Anda ingin bermutasituple
maka itu mungkinlist
saja.Kedua, jika Anda masih ingin mengubah tupel Anda, maka Anda dapat mengubahnya
tuple
menjadi alist
lalu mengubahnya kembali, dan menetapkan kembali tupel baru ke variabel yang sama. Ini bagus jika Anda hanya akan memutasi tupel Anda sekali . Kalau tidak, menurut saya itu berlawanan dengan intuisi. Karena ini pada dasarnya membuat tupel baru dan setiap kali jika Anda ingin memutasi tupel tersebut, Anda harus melakukan konversi. Juga Jika Anda membaca kode, akan membingungkan untuk berpikir mengapa tidak membuatlist
? Tapi itu bagus karena tidak memerlukan perpustakaan apa pun.Saya sarankan menggunakan
mutabletuple(typename, field_names, default=MtNoDefault)
dari mutabletuple 0.2 . Menurut saya pribadi cara ini lebih intuitif dan mudah dibaca. Pembacaan pribadi kode akan mengetahui bahwa penulis bermaksud untuk mengubah tupel ini di masa mendatang. Kelemahan dibandingkan denganlist
metode konversi di atas adalah Anda harus mengimpor file py tambahan.TL; DR : Jangan mencoba bermutasi
tuple
. jika Anda melakukannya dan itu adalah operasi satu kali ubahtuple
ke daftar, mutasikan, ubahlist
menjadi barutuple
, dan tetapkan kembali ke variabel yang menahan lamatuple
. Jika keinginantuple
dan entah bagaimana ingin menghindarilist
dan ingin bermutasi lebih dari satu kali maka ciptakanmutabletuple
.sumber
berdasarkan Ide Jon dan Trufa tersayang
itu mengubah semua kejadian nilai lama Anda
sumber
Tidak boleh. Jika Anda ingin mengubahnya, Anda perlu menggunakan daftar, bukan tupel.
Perhatikan bahwa Anda bisa membuat tupel baru yang memiliki nilai baru sebagai elemen pertamanya.
sumber
Saya telah menemukan cara terbaik untuk mengedit tupel adalah dengan membuat ulang tupel menggunakan versi sebelumnya sebagai basis.
Berikut adalah contoh yang saya gunakan untuk membuat versi warna yang lebih terang (saya sudah membukanya saat itu):
Apa yang dilakukannya, apakah itu melewati 'warna' tupel dan membaca setiap item, melakukan sesuatu padanya, dan akhirnya menambahkannya ke tupel baru.
Jadi yang Anda inginkan adalah seperti ini:
Yang spesifik itu tidak berfungsi, tetapi konsepnya adalah yang Anda butuhkan.
itulah konsepnya.
sumber
Saya terlambat ke permainan tetapi menurut saya cara yang paling sederhana , ramah sumber daya dan tercepat (tergantung pada situasinya) , adalah menimpa tupel itu sendiri. Karena ini akan menghilangkan kebutuhan untuk pembuatan daftar & variabel dan diarsipkan dalam satu baris.
Tetapi: Ini hanya berguna untuk tupel yang agak kecil dan juga membatasi Anda pada nilai tupel tetap, bagaimanapun, ini adalah kasus untuk tupel sebagian besar waktu.
Jadi dalam kasus khusus ini akan terlihat seperti ini:
sumber
tldr; "solusi" adalah membuat objek tupel baru, tidak benar-benar memodifikasi aslinya
Meskipun ini adalah pertanyaan yang sangat lama, seseorang memberi tahu saya tentang kegilaan tupel bermutasi Python ini. Yang mana saya sangat terkejut / tertarik, dan melakukan googling, saya mendarat di sini (dan sampel serupa lainnya secara online)
Saya menjalankan beberapa tes untuk membuktikan teori saya
Catatan
==
tidak menghargai persamaan sementarais
apakah persamaan referensial (adalah objek yang sama dengan obj b)Hasil:
sumber
Anda tidak dapat mengubah item dalam tupel, tetapi Anda dapat mengubah properti objek yang dapat berubah dalam tupel (misalnya jika objek tersebut adalah daftar atau objek kelas yang sebenarnya)
Sebagai contoh
sumber
saya melakukan ini:
dan untuk berubah, lakukan saja
dan u dapat mengubah tupel: D
ini dia disalin persis dari IDLE
sumber
x = (y)
tidak melakukan apa pun selain menugaskan y ke x.Anda dapat mengubah nilai tupel menggunakan salinan dengan referensi
sumber