Artikel ini bagian dari seri Belajar Python Level Basic di hanifmu.com. Di artikel sebelumnya kita sudah membahas Return Value. Sekarang kita telusuri di mana sebuah variabel bisa diakses.
Kamu mungkin pernah bingung kenapa variabel di dalam function tidak bisa diakses dari luar. Jawabannya ada di scope, aturan yang menentukan wilayah berlaku sebuah variabel.
Apa itu Scope?
Scope adalah wilayah di mana sebuah variabel bisa diakses. Python menentukan scope berdasarkan tempat variabel itu dibuat. Ada dua yang paling sering kamu temui: local dan global.
Local Scope
Variabel yang dibuat di dalam function hanya berlaku di dalam function itu. Wilayahnya disebut local scope:
def hitung():
hasil = 10 # variabel lokal
print(hasil)
hitung() # 10
print(hasil) # NameError: name 'hasil' is not defined
Variabel hasil hanya hidup selama function berjalan. Begitu function selesai, variabel itu hilang.
Setiap pemanggilan function punya variabel lokalnya sendiri:
def tambah():
angka = 0
angka += 1
print(angka)
tambah() # 1
tambah() # 1, bukan 2
Nilai angka selalu dimulai dari 0 di setiap pemanggilan.
Global Scope
Variabel yang dibuat di luar semua function berlaku di seluruh program. Wilayahnya disebut global scope:
nama = "Budi" # variabel global
def sapa():
print(f"Halo, {nama}")
sapa() # Halo, Budi
Function bisa membaca variabel global tanpa deklarasi tambahan.
Tapi hati-hati saat mengubahnya. Tanpa kata kunci khusus, menugaskan nilai ke nama yang sama di dalam function akan membuat variabel lokal baru:
nama = "Budi"
def ubah():
nama = "Sari" # ini variabel lokal baru
print(nama)
ubah() # Sari
print(nama) # Budi, global tidak berubah
Keyword global
Kalau memang ingin mengubah variabel global dari dalam function, gunakan kata kunci global:
nama = "Budi"
def ubah():
global nama
nama = "Sari"
ubah()
print(nama) # Sari
global memberi tahu Python bahwa nama yang dimaksud adalah variabel global, bukan variabel lokal baru.
Meski bisa, memakai global sebaiknya dihindari karena membuat alur program sulit dilacak. Lebih baik mengembalikan nilai dengan return dan menugaskannya di luar:
def ubah(nama):
return "Sari"
nama = "Budi"
nama = ubah(nama)
print(nama) # Sari
Nested Function dan nonlocal
Function bisa didefinisikan di dalam function lain. Variabel di function luar bisa dibaca oleh function dalam:
def luar():
pesan = "Halo"
def dalam():
print(pesan)
dalam()
luar() # Halo
Untuk mengubah variabel function luar dari function dalam, gunakan nonlocal:
def penghitung():
jumlah = 0
def tambah():
nonlocal jumlah
jumlah += 1
return jumlah
return tambah
hitung = penghitung()
print(hitung()) # 1
print(hitung()) # 2
nonlocal hanya berlaku untuk variabel di function luar, bukan variabel global.
Aturan LEGB
Saat Python mencari sebuah nama, ia mencarinya berurutan mengikuti aturan LEGB:
| Huruf | Arti | Wilayah |
|---|---|---|
| L | Local | Di dalam function saat ini |
| E | Enclosing | Function pembungkus di luarnya |
| G | Global | Di level file/modul |
| B | Built-in | Nama bawaan Python seperti len, print |
Python mencari dari yang paling dekat (Local) sampai paling jauh (Built-in). Nama pertama yang ditemukan itulah yang dipakai.
x = "global"
def luar():
x = "enclosing"
def dalam():
x = "local"
print(x)
dalam()
luar() # local
Kalau baris x = "local" dihapus, hasilnya enclosing. Kalau keduanya dihapus, hasilnya global. Urutan pencariannya jelas.
Contoh Program: Penghitung Sederhana
Mari gunakan nonlocal untuk membuat penghitung yang mengingat jumlah pemanggilan:
# penghitung.py
def buat_penghitung():
jumlah = 0
def tambah():
nonlocal jumlah
jumlah += 1
return jumlah
return tambah
hitung = buat_penghitung()
print(hitung()) # 1
print(hitung()) # 2
print(hitung()) # 3
Variabel jumlah tetap hidup di antara pemanggilan karena ditangkap oleh function tambah. Pola ini disebut closure, yang akan dibahas lebih dalam di level lanjutan.
Kesalahan Umum Pemula
- Mengakses variabel lokal dari luar — memicu
NameError. - Mengubah global tanpa
global— Python membuat variabel lokal baru diam-diam. - Memakai
globalberlebihan — sulit dilacak; gunakanreturnbila bisa. - Mengira
nonlocalberlaku untuk global —nonlocalhanya untuk function pembungkus. - Bingung saat nama sama muncul di beberapa scope — ingat aturan LEGB.
Ringkasan
- Scope menentukan wilayah berlaku sebuah variabel
- Variabel di dalam function bersifat lokal, hilang setelah function selesai
- Variabel di luar function bersifat global dan bisa dibaca di mana saja
globaldipakai untuk mengubah variabel global dari dalam functionnonlocaldipakai untuk mengubah variabel function pembungkus- Python mencari nama mengikuti aturan LEGB: Local, Enclosing, Global, Built-in
Langkah Selanjutnya
Kamu sudah bisa membuat function yang menerima masukan, mengembalikan hasil, dan mengatur scope dengan benar. Function seperti ini ditulis dengan def, tapi ada bentuk lain yang lebih singkat untuk tugas kecil.
Artikel selanjutnya membahas Lambda Function di Python, function ringkas satu baris untuk keperluan tertentu.
