Konsep nilai lalai dalam Python adalah berdasarkan penggunaan objek boleh ubah atau tidak boleh ubah. Dalam amalan pengaturcaraan, adalah lebih baik untuk tidak menggunakan objek boleh ubah sebagai nilai lalai. Sebaliknya, gunakan Tiada sebagai nilai lalai untuk mengelakkan masalah. Objek tidak berubah, seperti nombor, rentetan, tupel dan Tiada, tidak berubah. Untuk objek boleh ubah seperti kamus, senarai dan contoh kelas, perubahan boleh menyebabkan kekeliruan.
Mari kita lihat contoh kamus dalam fungsi dan masalahnya serta cara membetulkannya.
Kami ada fungsi. Dalam fungsi ini, kami mempunyai kamus sebagai parameter dan menetapkan nilai lalai. Kali pertama fungsi ini dipanggil, mydict mengandungi hanya satu item. Pada panggilan kedua, mydict mengandungi dua item kerana apabila foo() mula melaksanakan, mydict sudah mempunyai satu item.
def foo(mydict={}): ... calculate... mydict[key] = value return mydict
Kami sering menjangkakan panggilan fungsi untuk mencipta objek baharu dengan nilai lalai. Walau bagaimanapun, ini tidak berlaku. Nilai lalai hanya dibuat sekali apabila fungsi ditakrifkan. Jika objek diubah suai, seperti dalam contoh kamus di atas, panggilan seterusnya ke fungsi akan merujuk objek yang diubah suai.
Untuk menyelesaikan masalah menggunakan objek boleh ubah sebagai nilai lalai, seperti ini -
def foo(mydict={}): ...
Gunakan objek tidak berubah seperti Tiada -
def foo(mydict=None): if mydict is None: mydict = {}
Apabila anda mempunyai fungsi yang mahal dari segi pengiraan, satu teknik adalah untuk cache argumen dan nilai hasil untuk setiap panggilan ke fungsi, dan mengembalikan nilai cache apabila nilai yang sama diminta semula.
Ini dipanggil memoization dan boleh dicapai seperti ini -
# Callers can only provide two parameters and optionally pass _cache by keyword def expensive(arg1, arg2, *, _cache={}): if (arg1, arg2) in _cache: return _cache[(arg1, arg2)] # Calculate result = ... expensive computation ... _cache[(arg1, arg2)] = result return result
Yang berikut menyimpan keputusan dalam cache −
_cache[(arg1, arg2)] = result
Atas ialah kandungan terperinci Mengapakah nilai lalai dikongsi antara objek dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!