Cara Mendalam Menyalin Senarai: Memahami Salinan Cetek vs. Dalam
Andaikan anda mempunyai senarai E0 dan mencipta salinan E0_copy menggunakan senarai (E0). Secara intuitif, anda mungkin menganggap bahawa E0_copy ialah salinan yang mendalam kerana ID mereka berbeza. Walau bagaimanapun, mengubah suai E0_copy dalam gelung secara tidak dijangka mengubah E0 juga. Mengapa ini berlaku?
Perangkap Salinan Cetek
senarai(...) mencipta salinan cetek, yang bermaksud ia hanya menduplikasi senarai paling luar sambil mengekalkan rujukan kepada senarai dalaman yang sama. Oleh itu, apabila anda memanipulasi senarai dalaman E0_copy, anda turut memberi kesan kepada E0 kerana kedua-dua senarai menghala kepada struktur dalaman yang sama.
Penyelesaian: Penyalinan Dalam
Untuk melaksanakan salinan dalam, gunakan fungsi copy.deepcopy(...). Ia mencipta salinan dalam tulen dengan menyalin semua objek secara rekursif, termasuk struktur bersarang. Operasi ini memastikan bahawa perubahan yang dibuat pada salinan tidak menjejaskan yang asal.
Demonstrasi
Pertimbangkan coretan kod berikut, di mana senarai(...) menghasilkan salinan cetek:
a = [[1, 2, 3], [4, 5, 6]] b = list(a) print(a == b) # True, indicates shallow copy
Sekarang, gunakan copy.deepcopy(...) untuk deep penyalinan:
import copy b = copy.deepcopy(a) print(a == b) # False, confirms deep copy
Kini, mengubah suai a tidak menjejaskan b, menunjukkan pengasingan yang disediakan oleh penyalinan dalam.
Atas ialah kandungan terperinci Mengapa Mengubah Suai Salinan Senarai Kadangkala Mengubah Salinan Asal: Salinan Cetek vs. Dalam?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!