# 8.10. `copy` --- Operasi shallow copy dan deep copy

Kode sumber: Lib/copy.py

Pernyataan penetapan dalam Python tidak menyalin objek, mereka membuat ikatan antara target dengan sebuah objek. Untuk collections yang dapat diubah atau memiliki item-item yang dapat diubah, sebuah penyalinan terkadang dibutuhkan sehingga seseorang dapat mengubah salinan tanpa mengubah yang lainnya. Modul ini menyediakan operasi salinan dangkal dan salinan dalam (dijelaskan dibawah ini).

Ringkasan antarmuka:

`copy.``copy`(x)

  Mengembalikan shallow copy dari x.

`copy.``deepcopy`(x[, memo])

  Mengembalikan deep copy dari x.

exception `copy.``error`

  Di angkat untuk error spesifik dari modul.

Perbedaan antara shallow copy dan deep copy hanya relevan untuk objek majemuk (objek yang berisi objek lainnya, seperti list atau kelas):

- Sebuah shallow copy membangun sebuah objek majemuk baru dan kemudian (sejauh mungkin) menyisipkan referensi ke dalamnya ke objek yang ditemukan di aslinya.

- Sebuah deep copy membangun objek majemuk baruk dan kemudian, secara rekursif, menyisipkan salinan ke dalamnya ke objek yang ditemukan di aslinya.

Dua masalah yang sering muncul pada operasi deep copy yang tidak muncul pada operasi shallow copy:

- Objek rekursif (objek majemuk yang secara langsung atau tidak langsung berisi sebuah referensi ke dirinya sendiri) mungkin menyebabkan sebuah perulangan rekursif.

- Karena deep copy menyalin segalanya sehingga mungkin menyalin terlalu banyak, seperti data yang dimaksudkan untuk dibagikan kepada salinan lain.

Fungsi `deepcopy()` menghindari masalah diatas dengan:

- menyimpan sebuah `memo` kamus dari objek yang sudah disalin selama penyalinan saat ini; dan

- membiarkan kelas-kelas yang didefinisikan oleh user menimpa operasi penyalinan atau kumpulan komponen yang disalin.

Modul ini tidak menyalin tipe-tipe seperti modul, metode, stack trace, stack frame, file, socket, window, array, atau tipe-tipe lainnya yang serupa. Modul ini dapat menyalin fungsi dan kelas (secara shallow dan deep), dengan mengembalikan objek asli tanpa perubahan; hal ini kompatibel dengan cara ini diperlakukan oleh modul `pickle`.

Salinan dangkal dari kamus dapat di buat menggunakan `dict.copy()`, dan list dengan menetapkan potongan dari keseluruhan list, sebagai contoh, `copied_list = original_list[:]`.

Kelas-kelas dapat menggunakan antarmuka yang sama untuk mengontrol penyalinan yang mereka gunakan untuk mengontrol pengawetan. Lihat deskripsi dari modul `pickle` untuk informasi dari metode ini. Faktanya, modul `copy` menggunakan fungsi pengawetan yang terdaftar dari modul `copyreg`.

Agar sebuah kelas dapat menentukan implementasi salinannya sendiri, ia dapat menentukan metode spesial `__copy__()` dan `__deepcopy__()`. Yang pertama dipanggil untuk mengimplementasikan operasi shallow copy; tanpa argument tambahan yang diberikan. Yang terakhir dipanggil untuk mengimplementasikan operasi deep copy; dengan memberikan satu argumen, yaitu kamus `memo`. Jika implementasi `__deepcopy__()` perlu untuk membuat deep copy dari sebuah komponen, harus memanggil fungsi `deepcopy()` dengan komponen sebagai argumen pertama dan kamus memo sebagai argumen kedua.

Lihat juga

Modul `pickle`

  Diskusi tentang metode khusus yang digunakan untuk mendukung pengambilan dan pemulihan status objek.