← Semua pembelajaran / Python Dasar
Fase 5 · Fungsi

Scope — Di Mana Variabel Hidup

Sumber kebingungan klasik: “variabelnya jelas-jelas sudah saya buat, kok tidak dikenali?” Jawabannya ada di sini.

Sumber asli docs.python.org Resmi Rangkuman ~4 menit baca

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

SituasiHasil
Variabel dibuat di dalam fungsiHilang saat fungsi selesai
Membaca variabel luar dari dalam fungsiBoleh
Menugaskan ulang variabel luar dari dalamMembuat variabel lokal baru
Butuh nilai dari luarKirim lewat parameter
Butuh hasil di luarKembalikan 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.