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
DDDasal
2024-12-07 20:25:16482semak imbas

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)

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'}

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

{'hello': 'goodbye'}
{'hello': 'goodbye'}
{'hello': 'goodbye'}

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

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)

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!

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