Scope — Di Mana Variabel Hidup
Sumber kebingungan klasik: “variabelnya jelas-jelas sudah saya buat, kok tidak dikenali?” Jawabannya ada di sini.
Intisari
- Variabel yang dibuat di dalam fungsi hanya hidup di dalam fungsi itu, dan hilang begitu fungsinya selesai.
- Fungsi bisa membaca variabel dari luar, tapi tidak bisa mengubahnya begitu saja.
- Nama yang sama di dalam dan di luar fungsi adalah dua variabel berbeda.
- Butuh nilai dari luar? Kirim lewat parameter. Butuh hasilnya di luar? Pakai
return. - Ada kata kunci
global, tapi hampir selalu tanda desain yang keliru. Hindari.
Variabel lokal
def hitung():
hasil = 42 # hanya ada di dalam fungsi ini
print(hasil) # 42
hitung()
print(hasil) # NameError: name 'hasil' is not defined
Setiap kali fungsi dipanggil, Python membuatkan ruang kerja sementara. Semua variabel yang lahir di situ dibuang saat fungsi selesai. Karena itulah dua fungsi bisa memakai nama variabel yang sama tanpa saling mengganggu — dan itu justru yang membuat fungsi aman dipakai ulang.
Membaca dari luar: boleh
pajak = 11 # variabel global
def hitung_pajak(harga):
return harga * pajak / 100 # boleh dibaca
print(hitung_pajak(100000)) # 11000.0
Mengubah dari dalam: tidak
jumlah = 0
def tambah():
jumlah = jumlah + 1 # UnboundLocalError
tambah()
Begitu Python melihat ada penugasan ke jumlah di dalam fungsi, ia menyimpulkan
jumlah adalah variabel lokal milik fungsi itu. Lalu baris tersebut mencoba
membaca isinya padahal belum pernah diisi — maka error.
skor = 10
def ubah():
skor = 99 # membuat variabel BARU yang kebetulan senama
print(skor) # 99
ubah()
print(skor) # 10 ← yang di luar tidak tersentuh
Cara yang benar: parameter masuk, return keluar
jumlah = 0
def tambah(nilai):
return nilai + 1
jumlah = tambah(jumlah) # 1
jumlah = tambah(jumlah) # 2
Ini pola yang perlu kamu tanam: data masuk lewat parameter, hasil keluar lewat return. Fungsi yang mengikuti pola ini bisa dipahami cukup dengan membaca dirinya sendiri, tanpa perlu tahu apa yang terjadi di seluruh program.
Soal kata kunci global
jumlah = 0
def tambah():
global jumlah # bisa, tapi jangan
jumlah += 1
Ini berhasil, tapi menciptakan masalah yang baru terasa nanti: sekarang isi jumlah bisa
berubah dari mana saja di programmu. Saat nilainya tiba-tiba salah, kamu harus memeriksa seluruh file
untuk mencari siapa yang mengubahnya. Anggap global sebagai isyarat bahwa struktur
programmu perlu ditata ulang.
Satu pengecualian: list dan dictionary
daftar = [1, 2, 3]
def tambah_item():
daftar.append(4) # ini BERHASIL, tanpa global
tambah_item()
print(daftar) # [1, 2, 3, 4]
Bedanya halus: kamu tidak menugaskan ulang daftar, kamu hanya mengubah isi objek yang
sudah ditunjuk olehnya. Python tidak melarangnya. Tapi kebiasaan ini tetap membuat fungsi jadi
sulit ditelusuri — lebih baik terima list-nya sebagai parameter:
def tambah_item(daftar):
daftar.append(4)
return daftar
daftar = tambah_item(daftar)
Ringkasan
| Situasi | Hasil |
|---|---|
| Variabel dibuat di dalam fungsi | Hilang saat fungsi selesai |
| Membaca variabel luar dari dalam fungsi | Boleh |
| Menugaskan ulang variabel luar dari dalam | Membuat variabel lokal baru |
| Butuh nilai dari luar | Kirim lewat parameter |
| Butuh hasil di luar | Kembalikan dengan return |
Latihan: ambil program daftar tugas dari Fase 4 dan pecah jadi fungsi-fungsi:
tambah_tugas(daftar, teks), hapus_tugas(daftar, nomor),
tampilkan(daftar). Semua data mengalir lewat parameter — tidak boleh ada global.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.