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
Lepaskan: 2024-12-08 09:09:11
asal
414 orang telah melayarinya

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
Salin selepas log masuk

Sekarang, gunakan copy.deepcopy(...) untuk deep penyalinan:

import copy
b = copy.deepcopy(a)
print(a == b)  # False, confirms deep copy
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan