Dalam temu bual Python, salinan cetek dan salinan dalam adalah soalan yang agak sukar. Enam puluh peratus orang tidak pernah mendengar tentang salinan cetek dan salinan mendalam, dan tiga peratus orang hanya memahami perkara asas perbezaan antara konsep dan kesederhanaan. Hanya kurang daripada seorang dewasa boleh membezakan dengan tepat antara kedua-duanya dan melengkapkan penulisan demo kod yang berkaitan! Marilah kita selesaikan kesukaran ini hari ini dan tambah berat untuk kenaikan pangkat ke temu duga! Artikel ini mungkin merupakan artikel yang paling mudah difahami di seluruh Internet yang menerangkan salinan cetek dan salinan mendalam Selagi anda mengikuti contoh dalam artikel dan latihan, anda pasti akan memahami kesukaran teknikal apa salinan cetek dan mendalam. salinan adalah!
Dalam jenis data pembolehubah Python (senarai, kamus, set), tetapkan pembolehubah jenis data pembolehubah kepada pembolehubah lain Kedua-dua pembolehubah merujuk kepada Objek yang sama mempunyai perkara yang sama alamat memori Jika satu pembolehubah diubah suai, pembolehubah lain akan diubah suai dengan sewajarnya. Jika anda ingin mengetahui butiran teknikal jenis data boleh ubah dan jenis data tidak berubah dalam python, sila baca artikel: Soalan lazim dalam temu bual Python: perbezaan antara jenis data boleh ubah dan jenis data tidak berubah.
Beri saya contoh daripada artikel saya sebelum ini.
l1=['a','b','c'] l2=l1 print(id(l1)) print(id(l2)) l2.append('d') print("************") print(id(l1)) print(l1) print(id(l2)) print(l2) 输出: 838366483528 838366483528 ************ 838366483528 ['a', 'b', 'c', 'd'] 838366483528 ['a', 'b', 'c', 'd']
Hasil keluaran tidak akan diterangkan di sini Alamat l1 dan l2 adalah sama, jadi ia akan mempengaruhi satu sama lain.
Menyalin tahap atas objek dan hanya menyalin "rujukan" objek.
Ambil contoh dari artikel sebelumnya Hanya ada satu lapisan dalam senarai, iaitu elemen tidak mengandungi senarai lain.
l3=['x','y','z'] l4=list(l3) print(id(l3)) print(id(l4)) l4.append('a') print(l3) print(l4) 输出 831456302152 831480344136 ['x', 'y', 'z'] ['x', 'y', 'z', 'a']
Seperti yang anda lihat daripada keputusan, alamat l3 dan l4 adalah berbeza, jadi ia tidak akan menjejaskan satu sama lain.
Mari kita ambil contoh lain dan biarkan elemen pertama dalam l3 menjadi senarai.
l3=[['x','y','z'],'a','b'] l4=list(l3) print(id(l3)) print(id(l4)) l4.append('c') print(l3) print(l4) 结果 533336249416 533337391240 [['x', 'y', 'z'], 'a', 'b'] [['x', 'y', 'z'], 'a', 'b', 'c']
Hasilnya betul-betul seperti yang dijangkakan, kerana elemen pertama ialah senarai, jadi ia juga mempunyai alamat, dan kami mencetaknya.
print(id(l3[0])) print(id(l4[0])) 结果 533336248904 533336248904
Kami mendapati bahawa alamat l3[0] dan l4[0] sebenarnya adalah sama, dan kemudian laksanakan kod berikut.
l3[0].append('yy') print(l3) print(l4) 结果 [['x', 'y', 'z', 'yy'], 'a', 'b'] [['x', 'y', 'z', 'yy'], 'a', 'b', 'c']
Hasilnya selaras dengan jangkaan Mengubah suai nilai l3[0] juga mempengaruhi l4[0]. Jadi apakah yang boleh kita lakukan untuk mengelakkan l3[0] dan l4[0] daripada menjejaskan satu sama lain. Ini memerlukan pengenalan salinan dalam.
Salinan dalam menyalin setiap lapisan dalam objek Objek yang disalin adalah bebas sepenuhnya daripada objek asal dan tidak mempunyai hubungan. Untuk melaksanakan salinan dalam, anda perlu menggunakan kaedah salinan dalam dalam modul salinan.
import copy l3=[['x','y','z'],'a','b'] #l4=list(l3) #浅拷贝,使用=copy.copy(l3)也可以实现浅拷贝 l4=copy.deepcopy(l3) #深拷贝 l4.append('c') print(id(l3[0])) print(id(l4[0])) l3[0].append('yy') print(l3) print(l4) 输出 407168435784 407166887304 [['x', 'y', 'z', 'yy'], 'a', 'b'] [['x', 'y', 'z'], 'a', 'b', 'c']
Anda dapat melihat bahawa l3[0] dan l4[0] adalah bebas sepenuhnya dan tidak mempunyai pengaruh antara satu sama lain.
Tidak banyak yang perlu diperkatakan, hanya gunakan dua gambar untuk memberikan penjelasan mudah:
Salinan cetek, seperti yang ditunjukkan di bawah:
Salinan dalam, seperti yang ditunjukkan di bawah:
Atas ialah kandungan terperinci Soalan temu bual Python yang kerap: salinan cetek dan salinan dalam. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!