Cara Menyalin Daftar dengan Python (Salinan Dangkal vs. Dalam)
Pelajari cara menyalin daftar dengan Python. Jelajahi pemotongan daftar, metode copy(), konstruktor daftar, dan kuasai perbedaan antara salinan dangkal dan dalam.
Ikhtisar
Di Python, daftar adalah objek yang bisa berubah, dan variabel menyimpan referensi ke objek ini di memori, bukan nilai sebenarnya. Artinya, jika Anda menetapkan daftar ke variabel baru (misalnya, `list_b = list_a`), kedua variabel akan mereferensikan daftar yang sama persis. Modifikasi apa pun yang dilakukan melalui `list_b` akan langsung memengaruhi `list_a`. Untuk menghindari efek samping ini, Anda harus membuat salinan daftar secara eksplisit.
Python menyediakan beberapa cara untuk membuat salinan daftar yang dangkal. Salinan dangkal membuat daftar baru yang berisi referensi ke elemen yang ditemukan dalam daftar asli. Metode umum mencakup penggunaan metode daftar `.copy()` bawaan, menggunakan pemotongan daftar `list_a[:]`, atau meneruskan daftar ke konstruktor `list()`. Semua ini membuat wadah daftar baru, memungkinkan Anda menambahkan atau menghapus elemen secara mandiri.
Namun, jika daftar berisi objek bersarang yang dapat diubah (seperti daftar atau kamus), salinan dangkal hanya akan menduplikasi wadah luar; objek yang disarangkan tetap dibagikan. Memodifikasi daftar bertumpuk pada salinan akan mengubah daftar asli. Untuk mencegah hal ini, Anda harus melakukan penyalinan mendalam menggunakan fungsi `deepcopy()` modul `copy`, yang secara rekursif mengkloning setiap objek di dalam hierarki.
Kode & Output Eksekusi
Kode ini mendemonstrasikan jebakan penetapan referensi, penyalinan dangkal menggunakan list.copy(), dan penyalinan dalam daftar bersarang menggunakan modul copy.
import copy
# 1. The assignment reference trap (Not a copy!)
original = [1, 2, 3]
reference = original
reference.append(99)
print("Reference modification affects original:", original)
# Reset list
original = [1, 2, 3]
# 2. Creating a shallow copy (using list.copy())
shallow_copy = original.copy()
shallow_copy.append(100)
print("\nOriginal:", original)
print("Shallow copy:", shallow_copy)
# 3. The nested list limitation of shallow copies
nested = [[1, 2], [3, 4]]
shallow_nested = nested.copy()
shallow_nested[0].append(99) # Modifying nested list
print("\nOriginal nested:", nested)
print("Shallow nested copy:", shallow_nested)
# 4. Creating a deep copy
nested_original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(nested_original)
deep_copy[0].append(99)
print("\nOriginal nested:", nested_original)
print("Deep copy (completely independent):", deep_copy)Reference modification affects original: [1, 2, 3, 99]
Original: [1, 2, 3]
Shallow copy: [1, 2, 3, 100]
Original nested: [[1, 2, 99], [3, 4]]
Shallow nested copy: [[1, 2, 99], [3, 4]]
Original nested: [[1, 2], [3, 4]]
Deep copy (completely independent): [[1, 2, 99], [3, 4]]Implementasi Langkah demi Langkah
- Gunakan my_list.copy() atau my_list[:] untuk membuat salinan dangkal struktur daftar datar.
- Hindari penetapan referensi seperti copy_list = my_list ketika Anda membutuhkan koleksi independen.
- Impor modul salin dan gunakan copy.deepcopy(my_list) untuk daftar yang berisi struktur bersarang yang dapat diubah.
- Pastikan Anda memahami struktur data untuk mengoptimalkan kinerja dan jejak memori.
Pertanyaan yang Sering Diajukan
Apa perbedaan antara salinan dangkal dan salinan dalam?
Salinan dangkal menyalin wadah terluar, tetapi mereferensikan objek yang dapat diubah dan disarangkan. Salinan dalam secara rekursif menduplikasi semua kontainer dan objek yang disarangkan, sehingga menghasilkan struktur data yang sepenuhnya terisolasi.
Apakah pemotongan daftar (daftar[:]) lebih cepat daripada daftar.copy()?
Performanya hampir sama karena keduanya menjalankan operasi C yang dioptimalkan. Menggunakan list.copy() umumnya lebih disukai agar mudah dibaca.
Topik Terkait
Pelajari cara mengiris daftar dengan Python menggunakan sintaks braket yang kuat. Kuasai argumen mulai, berhenti, dan langkah, pengindeksan negatif, dan daftar pembalikan.
Cara Menghapus Duplikat Dari Daftar dengan PythonPelajari cara menghapus duplikat dari daftar dengan Python sambil mempertahankan atau mengabaikan urutan. Bandingkan konversi set, tombol dict, dan metode loop.
Sumber Daya Python yang Direkomendasikan
Perluas pengetahuan Anda dengan tutorial interaktif terkait, lembar contekan, dan perbandingan kode.
Variabel Python & Tipe Data Dijelaskan
Memahami variabel Python dan tipe data inti (string, integer, float, boolean). Panduan pemula lengkap untuk penugasan memori dengan Python.
Lembar
Panduan referensi cepat untuk operasi daftar Python. Kuasai penambahan, penyisipan, penghapusan, pengurutan, dan pengirisan elemen.
Python vs JavaScript: Bahasa Pemrograman Mana yang Terbaik?
Perbandingan komprehensif antara Python dan JavaScript. Jelajahi perbedaan sintaksis, kinerja, kasus penggunaan (backend vs frontend), dan contoh pengkodean.