Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Mengubah Suai Salinan Senarai Kadangkala Mengubah Salinan Asal: Salinan Cetek vs. Dalam?

Mengapa Mengubah Suai Salinan Senarai Kadangkala Mengubah Salinan Asal: Salinan Cetek vs. Dalam?

Patricia Arquette
Patricia Arquetteasal
2024-12-08 09:09:11418semak imbas

Why Does Modifying a List Copy Sometimes Change the Original: Shallow vs. Deep Copy?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn