Sebuah function penerima notifikasi mungkin butuh sepuluh pengaturan, padahal sembilan di antaranya hampir selalu memakai nilai yang sama. Memaksa setiap pemanggil mengirim sepuluh argument membuat kode yang seharusnya satu baris menjadi riuh. Default parameter menyelesaikannya: parameter yang tidak dikirim nilai otomatis memakai nilai bawaan yang ditetapkan saat definisi. Chapter ini membahas cara kerjanya, urutan wajibnya, dan satu jebakan klasik yang wajib dipahami sebelum menulis function sesungguhnya.

Parameter dengan Nilai Bawaan #

Nilai bawaan ditulis dengan tanda = langsung di dalam baris def. Pemanggil boleh melewatkan parameter tersebut, dan nilai bawaan yang dipakai:

python
def sapa(nama, salam="Halo"):
    print(f"{salam}, {nama}!")

sapa("Budi")
sapa("Siti", "Selamat pagi")

Output yang Dihasilkan:

text
Halo, Budi!
Selamat pagi, Siti!

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 1 (def sapa(nama, salam="Halo"):): parameter nama wajib diisi; parameter salam memiliki nilai bawaan "Halo".
  2. Baris 4 (sapa("Budi")): hanya satu argument dikirim, sehingga argument tersebut masuk ke parameter pertama nama. Parameter salam memakai nilai bawaan "Halo".
  3. Baris 5 (sapa("Siti", "Selamat pagi")): dua argument dikirim, nilai bawaan salam tertimpa dengan "Selamat pagi".

Nilai bawaan juga boleh ditimpa lewat keyword argument, misalnya sapa("Budi", salam="Selamat malam") — sesuai aturan pencampuran pada Chapter Positional dan Keyword Arguments.

Parameter Berbawaan Wajib di Belakang #

Interpreter Python menolak definisi yang menempatkan parameter wajib setelah parameter berbawaan. Aturan ini menjaga pemasangan posisi tetap masuk akal: sekali sebuah parameter bisa dilewati, semua parameter setelahnya harus bisa dilewati juga:

python
>>> def sapa(salam="Halo", nama):
  File "<stdin>", line 1
    def sapa(salam="Halo", nama):
                           ^^^^
SyntaxError: parameter without a default follows parameter with a default

Pesan galat ini muncul langsung saat definisi dibaca — program bahkan belum sempat berjalan. Perbaikannya sederhana: pindahkan nama ke depan, def sapa(nama, salam="Halo").

Nilai Bawaan Dievaluasi Sekali #

Di sinilah letak jebakan terkenal Python. Ekspresi nilai bawaan dievaluasi satu kali, tepat ketika statement def dieksekusi — bukan setiap kali function dipanggil. Untuk nilai immutable seperti string dan angka, perilaku ini tidak terlihat. Untuk object mutable seperti list, satu evaluasi berarti satu object yang sama dipakai bersama seluruh pemanggilan:

python
def tambah_item(nama, keranjang=[]):
    keranjang.append(nama)
    return keranjang

print(tambah_item("roti"))
print(tambah_item("telur"))
print(tambah_item("susu"))

Output yang Dihasilkan:

text
['roti']
['roti', 'telur']
['roti', 'telur', 'susu']

Pemanggil kedua seharusnya menerima keranjang kosong, tetapi hasilnya berisi "roti" dari pemanggil pertama. Penyebabnya: list [] dibuat satu kali saat def dieksekusi; setiap pemanggilan tanpa argument keranjang menerima list yang sama. Statement append() lalu menumpuk item di dalam object bersama tersebut.

Solusi: Sentinel None #

Idiom baku Python untuk kasus ini adalah nilai bawaan None, lalu membuat list baru di dalam badan function:

python
def tambah_item(nama, keranjang=None):
    if keranjang is None:
        keranjang = []
    keranjang.append(nama)
    return keranjang

print(tambah_item("roti"))
print(tambah_item("telur"))

belanja = ["beras"]
print(tambah_item("gula", belanja))

Output yang Dihasilkan:

text
['roti']
['telur']
['beras', 'gula']

Mari kita telaah baris-baris kuncinya:

  1. Baris 1 (def tambah_item(nama, keranjang=None):): nilai bawaan kini None — object singleton immutable yang aman dibagikan karena tidak pernah dimutasi.
  2. Baris 2-3 (if keranjang is None:): pemeriksaan is None (bukan == None, sesuai pembahasan pada Chapter None dan None Type) mendeteksi pemanggilan yang tidak mengirim argument. List segar dibuat untuk pemanggilan tersebut.
  3. Baris 9 (print(tambah_item("gula", belanja))): pemanggil yang benar-benar mengirim list memakai list tersebut — item "gula" ditambahkan ke list belanja milik pemanggil.

Hasilnya, setiap pemanggilan tanpa argument mendapat keranjang kosong yang segar, sementara pemanggil yang mengirim list tetap bekerja normal.

Pola keranjang=None ini akan terus muncul di library Python maupun kode industri. Kenali polanya sekali sekarang, dan kita tidak akan pernah terkejut oleh keranjang yang “berhantu” di chapter-chapter berikutnya.