Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapakah Gelagat Argumen Lalai Boleh Berubah Python Membawa Kepada Pengumpulan Tidak Dijangka?

Mengapakah Gelagat Argumen Lalai Boleh Berubah Python Membawa Kepada Pengumpulan Tidak Dijangka?

Susan Sarandon
Lepaskan: 2024-12-22 15:42:16
asal
595 orang telah melayarinya

Why Does Python's Mutable Default Argument Behavior Lead to Unexpected Accumulation?

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

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!

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