GIST yang harus diambil adalah ini: Berurusan dengan daftar yang dangkal (tidak ada sub_lists, hanya satu elemen) menggunakan "penugasan normal" menimbulkan "efek samping" ketika Anda membuat daftar dangkal dan kemudian Anda membuat salinan daftar ini menggunakan "penugasan normal" . "Efek samping" ini adalah ketika Anda mengubah elemen apa pun dari daftar salinan yang dibuat, karena itu akan secara otomatis mengubah elemen yang sama dari daftar asli. Itu ketika copy
berguna, karena itu tidak akan mengubah elemen daftar asli ketika mengubah elemen salin.
Di sisi lain, copy
memang memiliki "efek samping" juga, ketika Anda memiliki daftar yang memiliki daftar di dalamnya (sub_lists), dan deepcopy
menyelesaikannya. Misalnya jika Anda membuat daftar besar yang memiliki daftar bersarang di dalamnya (sub_lists), dan Anda membuat salinan daftar besar ini (daftar asli). "Efek samping" akan muncul ketika Anda memodifikasi sub_lists dari daftar salinan yang secara otomatis akan mengubah sub_lists dari daftar besar. Terkadang (dalam beberapa proyek) Anda ingin menyimpan daftar besar (daftar asli Anda) karena tanpa modifikasi, dan semua yang Anda inginkan adalah membuat salinan elemen-elemennya (sub_lists). Untuk itu, solusi Anda adalah menggunakan deepcopy
yang akan menangani "efek samping" ini dan membuat salinan tanpa mengubah konten asli.
Perilaku copy
dan deep copy
operasi yang berbeda hanya menyangkut objek majemuk (yaitu: objek yang berisi objek lain seperti daftar).
Berikut adalah perbedaan yang diilustrasikan dalam contoh kode sederhana ini:
Pertama
mari kita periksa bagaimana copy
(dangkal) berperilaku, dengan membuat daftar asli dan salinan daftar ini:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Sekarang, mari kita jalankan beberapa print
tes dan lihat bagaimana perilaku daftar asli dibandingkan dengan daftar salinannya:
original_list dan copy_list memiliki alamat berbeda
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
elemen original_list dan copy_list memiliki alamat yang sama
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
sub_elements dari original_list dan copy_list memiliki alamat yang sama
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x1faef08 0x1faef08
memodifikasi elemen original_list TIDAK mengubah elemen copy_list
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
memodifikasi elemen copy_list TIDAK mengubah elemen original_list
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
memodifikasi sub_elemen original_list secara otomatis memodifikasi sub_elemen copy_list
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 7]
memodifikasi sub_elemen copy_list secara otomatis memodifikasi sub_elemen original_list
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 7]
Kedua
mari kita periksa bagaimana deepcopy
berperilaku, dengan melakukan hal yang sama seperti yang kita lakukan dengan copy
(membuat daftar asli dan salinan daftar ini):
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Sekarang, mari kita jalankan beberapa print
tes dan lihat bagaimana perilaku daftar asli dibandingkan dengan daftar salinannya:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.deepcopy(original_list)
original_list dan copy_list memiliki alamat berbeda
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
elemen original_list dan copy_list memiliki alamat yang sama
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
sub_elements dari original_list dan copy_list memiliki alamat yang berbeda
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x24eef08 0x24f3300
memodifikasi elemen original_list TIDAK mengubah elemen copy_list
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
memodifikasi elemen copy_list TIDAK mengubah elemen original_list
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
memodifikasi sub_elemen original_list TIDAK mengubah sub_elemen copy_list
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
memodifikasi sub_elemen copy_list TIDAK mengubah sub_elemen original_list
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'd'], 7]