Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapakah Gelagat Argumen Lalai Boleh Berubah Python Nampak Sangat Mengejutkan?

Mengapakah Gelagat Argumen Lalai Boleh Berubah Python Nampak Sangat Mengejutkan?

Susan Sarandon
Lepaskan: 2024-12-24 08:46:20
asal
887 orang telah melayarinya

Why Does Python's Mutable Default Argument Behavior Seem So Surprising?

"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
Salin selepas log masuk

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]
Salin selepas log masuk

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!

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