Soalan temu bual Python yang kerap: salinan cetek dan salinan dalam

WBOY
Lepaskan: 2023-04-12 11:37:05
ke hadapan
1769 orang telah melayarinya

Soalan temu bual Python yang kerap: salinan cetek dan salinan dalam

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!

Penugasan pembolehubah

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

Hasil keluaran tidak akan diterangkan di sini Alamat l1 dan l2 adalah sama, jadi ia akan mempengaruhi satu sama lain.

Salinan cetek

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

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

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

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

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

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

Anda dapat melihat bahawa l3[0] dan l4[0] adalah bebas sepenuhnya dan tidak mempunyai pengaruh antara satu sama lain.

Ringkasan salinan cetek dan salinan dalam

Tidak banyak yang perlu diperkatakan, hanya gunakan dua gambar untuk memberikan penjelasan mudah:

Salinan cetek, seperti yang ditunjukkan di bawah:

Soalan temu bual Python yang kerap: salinan cetek dan salinan dalam

Salinan dalam, seperti yang ditunjukkan di bawah:


Soalan temu bual Python yang kerap: salinan cetek dan salinan dalam

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!

Label berkaitan:
sumber:51cto.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan