Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Tugasan Python Menunjukkan Kelakuan Tidak Dijangka dengan Objek Boleh Berubah?
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:
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!