"Least Astonishment" and the Mutable Default Argument
Gelagat hujah lalai boleh ubah Python telah lama membingungkan pemula dan pembangun berpengalaman. Fungsi seperti foo(a=[]) secara tidak dijangka mengumpul nilai dalam pelbagai panggilan, menyebabkan ramai yang mempersoalkan rasionalnya.
Untuk memahami punca reka bentuk yang kelihatan cacat ini, kita mesti menyelidiki sifat fungsi Python sebagai objek kelas pertama. Apabila fungsi ditakrifkan, ia pada dasarnya dinilai sebagai objek itu sendiri. Ini bermakna parameter lalai, seperti a=[] dalam contoh kami, menjadi atribut bagi objek fungsi.
Oleh itu, apabila fungsi dipanggil, ia bukan nilai parameter lalai yang dinilai, tetapi sebaliknya atribut yang menunjuk kepada objek senarai yang dicipta pada definisi fungsi. Akibatnya, sebarang pengubahsuaian yang dibuat pada senarai dalam fungsi memberi kesan kepada rujukan yang dikongsi, menerangkan gelagat terkumpul a.
Pendekatan ini sejajar dengan falsafah "paling tidak terkejut" Python, yang mengutamakan ketekalan dan pematuhan kepada objek- prinsip berorientasikan. Sama seperti pembolehubah contoh dalam kelas boleh berubah dari semasa ke semasa, begitu juga "data ahli" ini dalam objek fungsi.
Tingkah laku ini juga berfungsi untuk tujuan praktikal: ia membenarkan fungsi mempunyai keadaan yang berterusan merentas panggilan. Pertimbangkan contoh berikut:
def a(): print("a executed") return [] def b(x=a()): x.append(5) print(x) a executed >>> b() [5] >>> b() [5, 5]
Di sini, nilai yang dikembalikan oleh a() dikongsi oleh semua panggilan ke b(), membenarkan senarai diubah suai dan dikekalkan dalam berbilang lelaran. Mengikat hujah lalai pada pelaksanaan fungsi akan mencipta senarai baharu dengan berkesan setiap kali b() dipanggil, menjadikan tingkah laku ini mustahil.
Kesimpulannya, walaupun tingkah laku hujah lalai boleh ubah Python mungkin kelihatan berlawanan dengan intuitif pada mulanya, ia berpunca daripada sifat fungsi kelas pertama bahasa dan selaras dengan prinsip pengaturcaraan dan ketekalan berorientasikan objek.
Atas ialah kandungan terperinci Mengapakah Gelagat Argumen Lalai Boleh Berubah Python Membawa Kepada Pengumpulan Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!