Tingkah laku yang tidak dijangka bagi fungsi foo dalam Python, di mana argumen lalai terikat pada definisi fungsi dan bukannya pelaksanaan, mempunyai membingungkan ramai. Malah ada yang menganggapnya sebagai kesilapan pengaturcaraan. Walau bagaimanapun, tingkah laku ini mempunyai rasional yang kukuh yang berakar umbi dalam sifat Python sebagai bahasa dengan fungsi kelas pertama.
Fungsi dalam Python bukan sekadar blok kod; ia adalah objek yang dinilai pada masa definisinya. Penilaian ini termasuk argumen lalai yang mengikat, yang bertindak sebagai "data ahli" untuk objek fungsi. Akibatnya, perubahan yang dibuat kepada argumen lalai berterusan merentas panggilan fungsi, sama seperti cara perubahan keadaan dalam mana-mana objek dikekalkan.
Untuk menggambarkan, pertimbangkan fungsi a yang mencetak mesej dan mengembalikan senarai kosong. Satu lagi fungsi b mengambil satu parameter x dengan nilai lalai a(). Apabila b dipanggil tanpa menyatakan x, ia mengikat x kepada hasil panggilan a, yang mengembalikan senarai kosong. Walau bagaimanapun, memandangkan senarai kosong disimpan sebagai hujah lalai dalam b, panggilan seterusnya kepada b akan ditambahkan pada senarai yang sama ini, menghasilkan tingkah laku yang diperhatikan di mana [5] dicetak pada panggilan pertama dan [5, 5] pada panggilan kedua .
Tingkah laku ini mengikut prinsip "paling tidak terkejut", yang menentukan bahawa kelakuan program harus sejajar dengan apa yang dijangkakan oleh pengaturcara secara munasabah. Dalam kes ini, sebaik sahaja objek fungsi ditakrifkan, argumen lalainya menjadi sebahagian daripada keadaannya dan sebarang pengubahsuaian pada hujah tersebut ditunjukkan dalam panggilan seterusnya.
Walaupun tingkah laku ini mungkin kelihatan berlawanan dengan intuitif bagi sesetengah pihak, ia adalah konsisten. dengan falsafah reka bentuk Python. Berfungsi sebagai objek kelas pertama membolehkan fleksibiliti yang lebih besar dan menggalakkan gaya pengaturcaraan yang lebih berorientasikan objek. Memahami konsep ini meningkatkan pemahaman pengaturcara tentang asas Python dan menggalakkan pembangunan kod yang lebih mantap dan berkesan.
Atas ialah kandungan terperinci Mengapa Argumen Lalai Boleh Berubah dalam Python Membawa kepada Gelagat Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!