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
Susan Sarandonasal
2024-12-24 08:46:20889semak imbas

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

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!

Kenyataan:
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