Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapakah Gelagat Argumen Lalai Boleh Berubah Python Nampak Sangat Mengejutkan?
"Least Astonishment" and the Mutable Default Argument
Gelagat mengejutkan Python dengan hujah lalai boleh ubah telah membingungkan ramai pembangun. Pertimbangkan perkara berikut:
def foo(a=[]): a.append(5) return a
Secara intuitif, seseorang mungkin mengharapkan fungsi ini sentiasa mengembalikan senarai yang mengandungi hanya [5] apabila dipanggil tanpa parameter. Walau bagaimanapun, andaian ini dipecahkan oleh output sebenar:
>>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5]
Jadi, apa yang berlaku?
Kuncinya terletak pada objek fungsi kelas pertama Python. Apabila fungsi ditakrifkan, ia dinilai serta-merta, termasuk penilaian argumen lalai. Dalam kes foo, nilai lalai untuk a dinilai kepada senarai kosong. Walau bagaimanapun, senarai ini disimpan dalam objek fungsi itu sendiri, menjadikannya boleh berubah untuk panggilan berikutnya.
Tidak seperti dalam bahasa seperti C, parameter fungsi dalam Python bukanlah pembolehubah statik yang dinilai pada masa penyusunan. Sebaliknya, mereka terikat pada objek yang mungkin berubah dari semasa ke semasa. Konsep "data ahli" dalam objek fungsi ini menerangkan tingkah laku menakjubkan yang kami perhatikan dengan argumen lalai boleh ubah.
Seperti yang dicatatkan oleh effbot dalam Nilai Parameter Lalai dalam Python, tingkah laku ini adalah logik dan konsisten dengan cara objek lain berfungsi :
"Mana-mana objek boleh diubah keadaannya daripada satu panggilan ke panggilan lain. Mengapakah fungsi harus berbeza?"
Oleh itu, walaupun tingkah laku ini pada mulanya mungkin mengejutkan, ia akhirnya mengikut prinsip "paling tidak hairan" dengan menyelaraskan dengan sifat berorientasikan objek Python dan jangkaan tingkah laku objek boleh ubah.
Atas ialah kandungan terperinci Mengapakah Gelagat Argumen Lalai Boleh Berubah Python Nampak Sangat Mengejutkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!