Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapakah Panggilan Seterusnya kepada Fungsi Python dengan Argumen Lalai Boleh Berubah Menghasilkan Keputusan Yang Tidak Dijangka?

Mengapakah Panggilan Seterusnya kepada Fungsi Python dengan Argumen Lalai Boleh Berubah Menghasilkan Keputusan Yang Tidak Dijangka?

Barbara Streisand
Lepaskan: 2025-01-03 19:44:42
asal
593 orang telah melayarinya

Why Do Subsequent Calls to a Python Function with a Mutable Default Argument Produce Unexpected Results?

Anomali Pengikat Argumen Lalai

Argumen lalai Python, apabila terikat pada definisi fungsi dan bukannya pelaksanaan, boleh membingungkan pengaturcara. Sebagai contoh, pertimbangkan fungsi ini:

def foo(a=[]):
    a.append(5)
    return a
Salin selepas log masuk

Ia mengembalikan senarai dengan satu elemen, [5], untuk panggilan pertama. Walau bagaimanapun, panggilan seterusnya meningkatkan kiraan elemen ini, menghasilkan corak yang tidak dijangka:

>>> foo()
[5]
>>> foo()
[5, 5]
>>> foo()
[5, 5, 5]
Salin selepas log masuk

Tingkah laku yang kelihatan tidak logik ini berpunca daripada konsep asas Python berfungsi sebagai objek kelas pertama. Selepas definisi fungsi, Python menilai fungsi dan parameter lalainya sebagai "data ahli" objek fungsi. Akibatnya, parameter ini mengekalkan keadaannya merentas seruan fungsi, sama seperti atribut kelas biasa.

Ikatan pada masa definisi ini mempunyai rasional yang jelas: ia memastikan bahawa semua aspek definisi fungsi diselesaikan terlebih dahulu. Jika pengikatan dilakukan pada pelaksanaan fungsi, tandatangan fungsi akan menjadi "hibrid", dengan sebahagian daripada pengikatan berlaku pada takrifan dan sebahagian pada pemanggilan. Ketidakkonsistenan ini boleh menimbulkan kemungkinan ralat dan kekeliruan.

Dengan mengikat argumen lalai pada definisi, Python mengekalkan integriti objek fungsi sebagai entiti tidak berubah. Tingkah laku ini menyediakan rangka kerja yang konsisten dan mudah difahami untuk bekerja dengan fungsi Python dan parameter lalai yang berkaitan.

Atas ialah kandungan terperinci Mengapakah Panggilan Seterusnya kepada Fungsi Python dengan Argumen Lalai Boleh Berubah Menghasilkan Keputusan Yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan