Python - Salin Senarai

Halo, pemrogram Python yang berhasrat! Hari ini, kita akan menyelam ke atas dunia yang menarik tentang pengambilan salinan senarai di Python. Sebagai guru sains komputer yang mesra di kampung kita, saya di sini untuk menjawab anda melalui perjalanan ini dengan penjelasan yang jelas, banyak contoh, dan mungkin juga beberapa rakit penyembur di sepanjang jalan. Jadi, mari kita mula!

Python - Copy Lists

Menyalin Senarai di Python

Sebelum kita melompat ke cara yang berbeza untuk menyalin senarai, mari kitaerti dahulu mengapa kita perlu untuk menyalin senarai di tempat pertama. Bayangkan anda memiliki senarai belanja, dan anda ingin untuk berkongsi itu dengan rakan penyewa anda. Anda boleh memberikannya senarai asal anda, tetapi apa jika mereka membuat keputusan untuk menambah "coklat" kepadanya (siapa yang tidak)? Sudden, senarai belanja sehat yang telah anda rancang dengan hati-hati kini kena kompromi! Ini adalah di mana salinan menjadi berguna.

Di Python, apabila anda menetapkan senarai kepada pembolehubah baru, anda tidak membuat senarai baru. Sebaliknya, anda membuat rujukan baru ke atas senarai yang sama. Mari kita lihat ini dalam tindakan:

original_list = [1, 2, 3, 4, 5]
new_list = original_list

print("Senarai asal:", original_list)
print("Senarai baru:", new_list)

new_list.append(6)

print("Senarai setelah pengubahsuaian:", original_list)
print("Senarai baru setelah pengubahsuaian:", new_list)

Output:

Senarai asal: [1, 2, 3, 4, 5]
Senarai baru: [1, 2, 3, 4, 5]
Senarai setelah pengubahsuaian: [1, 2, 3, 4, 5, 6]
Senarai baru setelah pengubahsuaian: [1, 2, 3, 4, 5, 6]

Surprised? Kedua-dua senarai berubah kerana mereka sebenarnya adalah senarai yang sama di atas penyimpanan. Ini adalah di mana salinan datang untuk penyelamat!

Salinan Datar pada Senarai Python

Salinan datar membuat objek senarai baru, tetapi elemen di atas senarai baru adalah rujukan kepada objek yang sama di atas senarai asal. Ia seperti membuat rakaman fotokopi atas senarai belanja anda – anda memiliki kertas baru, tetapi item yang ditulis di atasnya adalah yang sama.

Mari kita lihat bagaimana untuk membuat salinan datar:

import copy

original_list = [1, [2, 3], 4]
shallow_copy = copy.copy(original_list)

print("Senarai asal:", original_list)
print("Salinan datar:", shallow_copy)

shallow_copy[1][0] = 'dua'

print("Senarai asal setelah pengubahsuaian:", original_list)
print("Salinan datar setelah pengubahsuaian:", shallow_copy)

Output:

Senarai asal: [1, [2, 3], 4]
Salinan datar: [1, [2, 3], 4]
Senarai asal setelah pengubahsuaian: [1, ['dua', 3], 4]
Salinan datar setelah pengubahsuaian: [1, ['dua', 3], 4]

Perhatikan bagaimana mengubah senarai bersarang di atas salinan datar juga menjejaskan senarai asal? Itu kerana senarai bersarang masih rujukan kepada objek yang sama di atas penyimpanan.

Salinan Dalam pada Senarai Python

Sebaliknya, salinan dalam membuat senarai baru dan secara rekursif menambah salinan objek bersarang. Ia seperti menulis semula senarai belanja anda secara tangan – semua adalah baru dan bebas.

Berikut adalah bagaimana untuk membuat salinan dalam:

import copy

original_list = [1, [2, 3], 4]
deep_copy = copy.deepcopy(original_list)

print("Senarai asal:", original_list)
print("Salinan dalam:", deep_copy)

deep_copy[1][0] = 'dua'

print("Senarai asal setelah pengubahsuaian:", original_list)
print("Salinan dalam setelah pengubahsuaian:", deep_copy)

Output:

Senarai asal: [1, [2, 3], 4]
Salinan dalam: [1, [2, 3], 4]
Senarai asal setelah pengubahsuaian: [1, [2, 3], 4]
Salinan dalam setelah pengubahsuaian: [1, ['dua', 3], 4]

Kali ini, mengubah salinan dalam tidak menjejaskan senarai asal. Ia sepenuhnya bebas!

Menyalin Senarai Menggunakan Notasi Potongan

Sekarang, mari kita lihat beberapa cara lain untuk menyalin senarai. Salah satu cara termudah adalah menggunakan notasi potongan. Ia seperti mengatakan, "Saya mahu salinan keseluruhan senarai dari awal hingga akhir."

original_list = [1, 2, 3, 4, 5]
slice_copy = original_list[:]

print("Senarai asal:", original_list)
print("Salinan potongan:", slice_copy)

slice_copy.append(6)

print("Senarai asal setelah pengubahsuaian:", original_list)
print("Salinan potongan setelah pengubahsuaian:", slice_copy)

Output:

Senarai asal: [1, 2, 3, 4, 5]
Salinan potongan: [1, 2, 3, 4, 5]
Senarai asal setelah pengubahsuaian: [1, 2, 3, 4, 5]
Salinan potongan setelah pengubahsuaian: [1, 2, 3, 4, 5, 6]

Cara ini membuat salinan datar dari senarai, yang biasanya mencukupi untuk senarai objek tak berubah seperti nombor dan rakam.

Menyalin Senarai Menggunakan Fungsi list()

Cara lain untuk membuat salinan adalah dengan menggunakan fungsi list(). Ia seperti memberitahu Python, "Buat saya senarai baru yang terlihat seperti ini."

original_list = [1, 2, 3, 4, 5]
list_copy = list(original_list)

print("Senarai asal:", original_list)
print("Salinan list:", list_copy)

list_copy.append(6)

print("Senarai asal setelah pengubahsuaian:", original_list)
print("Salinan list setelah pengubahsuaian:", list_copy)

Output:

Senarai asal: [1, 2, 3, 4, 5]
Salinan list: [1, 2, 3, 4, 5]
Senarai asal setelah pengubahsuaian: [1, 2, 3, 4, 5]
Salinan list setelah pengubahsuaian: [1, 2, 3, 4, 5, 6]

Cara ini juga membuat salinan datar dari senarai.

Menyalin Senarai Menggunakan Fungsi copy()

Terakhir tetapi bukan yang kekurangan, kita ada kaedah copy(), yang adalah kaedah terbina-dalam untuk senarai. Ia seperti senarai yang mengatakan, "Ini, ambil salinan diri saya!"

original_list = [1, 2, 3, 4, 5]
copy_method = original_list.copy()

print("Senarai asal:", original_list)
print("Salinan kaedah:", copy_method)

copy_method.append(6)

print("Senarai asal setelah pengubahsuaian:", original_list)
print("Salinan kaedah setelah pengubahsuaian:", copy_method)

Output:

Senarai asal: [1, 2, 3, 4, 5]
Salinan kaedah: [1, 2, 3, 4, 5]
Senarai asal setelah pengubahsuaian: [1, 2, 3, 4, 5]
Salinan kaedah setelah pengubahsuaian: [1, 2, 3, 4, 5, 6]

Cara ini juga membuat salinan datar dari senarai.

Sekarang, mari kita ringkaskan semua kaedah ini di atas rakam yang mudah dipakai:

Kaedah Sintaks Jenis Salinan Catatan
Penetapan new_list = original_list Rujukan Bukan salinan sebenar
Salinan Datar copy.copy(original_list) Datar Senarai baru, rujukan objek sama
Salinan Dalam copy.deepcopy(original_list) Dalam Senarai baru, rujukan objek baru
Notasi Potongan original_list[:] Datar Mudah dan dapat dibaca
Fungsi list() list(original_list) Datar Inten yang jelas
Kaedah copy() original_list.copy() Datar Kaedah terbina-dalam senarai

Ingat, pemilihan kaedah salinan yang betul bergantung kepada keperluan anda yang khusus. Jika anda berurusan dengan senarai yang sederhana objek tak berubah, salinan datar biasanya mencukupi. Tetapi jika anda ada senarai bersarang atau objek yang boleh diubahsuai, anda mungkin perlu salinan dalam untuk memastikan kebebasan penuh.

Dan itu adalah! Anda kini dilengkapi dengan pengetahuan untuk menyalin senarai seperti profesional. Lagi sekali anda perlu untuk berkongsi senarai belanja anda, anda akan tahu secara pasti cara untuk membuat salinan tanpa risiko penambahan yang tidak diinginkan. Happy coding, dan may senarai anda sentiasa di salin dengan sempurna!

Credits: Image by storyset