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.

Coba Solusi ini di Editor

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.

copy_lists.py
Coba di Editor
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)
Keluaran Terminal
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

Sumber Daya Python yang Direkomendasikan

Perluas pengetahuan Anda dengan tutorial interaktif terkait, lembar contekan, dan perbandingan kode.