Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Tugasan Python Menunjukkan Kelakuan Tidak Dijangka dengan Objek Boleh Berubah?

Mengapa Tugasan Python Menunjukkan Kelakuan Tidak Dijangka dengan Objek Boleh Berubah?

DDD
Lepaskan: 2024-12-07 20:25:16
asal
467 orang telah melayarinya

Why Does Python Assignment Show Unexpected Behavior with Mutable Objects?

Gelagat Salin Melalui dalam Tugasan Python

Pengenalan

Python, bahasa pengaturcaraan yang popular, mempersembahkan tingkah laku yang pelik apabila memberikan objek kepada pembolehubah melalui pengendali tugasan (=). Tingkah laku ini, yang biasanya dirujuk sebagai salinan, selalunya membawa kepada hasil yang tidak dijangka. Untuk membongkar konsep ini, mari kita periksa contoh biasa.

Masalah: Salin-Terus lwn. Salin

Pertimbangkan kod berikut:

dict_a = dict_b = dict_c = {}
dict_c['hello'] = 'goodbye'

print(dict_a)
print(dict_b)
print(dict_c)
Salin selepas log masuk

Orang akan menjangkakan kod ini mencipta tiga kamus berasingan, memulakannya untuk mengosongkan, dan kemudian mengubah suai dict_c sahaja. Output yang dijangkakan hendaklah:

{}
{}
{'hello': 'goodbye'}
Salin selepas log masuk

Walau bagaimanapun, tingkah laku salin lalu Python menghasilkan hasil yang berbeza:

{'hello': 'goodbye'}
{'hello': 'goodbye'}
{'hello': 'goodbye'}
Salin selepas log masuk

Penjelasan: Tugasan Rujukan

Kunci untuk memahami tingkah laku ini terletak pada sifat pembolehubah dalam Python. Dalam Python, pembolehubah (atau nama) hanyalah penunjuk kepada objek sebenar yang disimpan dalam ingatan. Apabila anda menetapkan satu pembolehubah kepada yang lain, pengendali tugasan (=) menyalin alamat memori (atau penunjuk) dari satu pembolehubah ke yang lain. Dalam contoh kami:

dict_a = dict_b = dict_c
Salin selepas log masuk

Ini bermakna dict_a, dict_b dan dict_c semuanya menunjuk ke objek kamus yang sama dalam ingatan. Apabila dict_c diubah suai, oleh itu, ketiga-tiga pembolehubah melihat pengubahsuaian yang sama, menghasilkan kesan salin-lalu.

Menyelesaikan Isu: Menggunakan Kaedah Salin

Untuk mengelakkan tingkah laku salin, seseorang mesti mencipta salinan objek asas secara eksplisit. Python menyediakan dua kaedah untuk tujuan ini:

  • dict.copy(): Mencipta salinan cetek yang menyalin elemen peringkat atas kamus.
  • copy.deepcopy(): Mencipta salinan dalam yang secara rekursif menyalin semua objek bersarang dalam kamus.

Contoh:

dict_a = dict_b.copy()
dict_c = copy.deepcopy(dict_a)

dict_c['hello'] = 'goodbye'

print(dict_a)  # {'hello': 'goodbye'} (shallow copy, affected)
print(dict_b)  # {} (unaffected)
print(dict_c)  # {'hello': 'goodbye'} (deep copy, unaffected)
Salin selepas log masuk

Dengan menggunakan kaedah penyalinan ini, kita boleh mencipta salinan bebas objek dan mengelakkan tingkah laku penyalinan.

Atas ialah kandungan terperinci Mengapa Tugasan Python Menunjukkan Kelakuan Tidak Dijangka dengan Objek Boleh Berubah?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan