Namespace & Ruang Lingkup Variabel Python: Memahami Nama, Binding, dan Ruang Lingkup
Namespace & Ruang Lingkup Variabel Python
Jelajahi cara kerja nama, namespace, dan ruang lingkup variabel dalam Python, dengan contoh yang jelas dan praktik terbaik.
Apa Itu Nama dalam Python?
Dalam “The Zen of Python” (import this), baris terakhir berbaca, “Namespace adalah ide yang hebat sekali — mari kita lakukan lebih banyak!” Jadi, apa itu namespace? Pertama, mari kita definisikan nama.
Nama, atau identifier, adalah label yang merujuk ke objek. Semuanya dalam Python adalah objek, dan nama memberikan cara yang nyaman untuk mengaksesnya.
Misalnya, saat kita mengeksekusi a = 2, integer 2 disimpan di memori dan a menjadi referensinya. Fungsi bawaan id() mengembalikan alamat memori dari objek.
# Catatan: Nilai id Anda mungkin berbeda a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))
Output
id(2) = 9302208 id(a) = 9302208
Kedua nama menunjuk ke objek yang sama, jadi nilai id() mereka cocok. Mari kita lihat apa yang terjadi saat kita mengikat ulang a:
# Catatan: Nilai id Anda mungkin berbeda a = 2 print('id(a) =', id(a)) a = a + 1 print('id(a) =', id(a)) print('id(3) =', id(3)) b = 2 print('id(b) =', id(b)) print('id(2) =', id(2))
Saat a = a + 1 dieksekusi, objek baru 3 dibuat, dan a kini merujuk padanya. Perhatikan bahwa id(a) dan id(3) identik. Penugasan berikutnya b = 2 hanya mengikat b ke objek 2 yang sudah ada, menghindari penyimpanan duplikat.
Binding nama dinamis inilah yang membuat Python fleksibel: satu identifier dapat menunjuk ke nilai dari tipe apa pun—termasuk fungsi.
def printHello(): print("Hello") a = printHello a()
Output
Hello
Identifier a kini merujuk ke fungsi printHello, yang dapat kita panggil secara langsung.
Apa Itu Namespace?
Namespace adalah pemetaan dari nama ke objek. Pikirkannya sebagai kamus yang menyimpan setiap identifier yang Anda definisikan beserta objek terkaitnya.
Python mendukung banyak namespace secara bersamaan, masing-masing terisolasi dari yang lain. Interpreter membuat namespace global yang berisi semua nama bawaan yang bertahan untuk seumur hidup sesi. Setiap modul memiliki namespace globalnya sendiri, dan setiap definisi fungsi atau kelas memperkenalkan namespace lokal baru.
Ruang Lingkup Variabel dalam Python
Sementara namespace ada, ruang lingkup menentukan di mana sebuah nama dapat diakses tanpa kwalifikasi.
Pada setiap saat, program memiliki setidaknya tiga ruang lingkup bersarang:
Ruang lingkup lokal dari fungsi yang sedang dieksekusi.
Ruang lingkup global dari modul.
Ruang lingkup bawaan yang selalu tersedia.
Saat sebuah nama dirujuk di dalam fungsi, Python mencari namespace lokal terlebih dahulu, kemudian global, dan akhirnya namespace bawaan. Jika sebuah fungsi berisi fungsi lain, yang dalam memperkenalkan ruang lingkup bersarang baru.
Contoh: Interaksi Ruang Lingkup dan Namespace
Pertimbangkan kode berikut:
def outer_function(): b = 20 def inner_func(): c = 30 a = 10
Di sini, a tinggal di namespace global modul. Variabel b lokal untuk outer_function, dan c miliki namespace lokal bersarang dari inner_func.
Di dalam inner_func, c lokal, b non-lokal, dan a global. Anda dapat membaca dan menulis c, tetapi hanya dapat membaca b dan a kecuali Anda mendeklarasikannya secara eksplisit dengan global atau nonlocal.
Ini adalah ilustrasi yang lebih konkret:
def outer_function(): a = 20 def inner_function(): a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)
Output menunjukkan tiga binding a yang berbeda:
a = 30 a = 20 a = 10
Untuk memaksa semua penugasan ke a global, gunakan kata kunci global:
def outer_function(): global a a = 20 def inner_function(): global a a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)
Output sekarang mencerminkan satu a global:
a = 30 a = 30 a = 30
Contoh-contoh ini mengilustrasikan bagaimana aturan namespace dan ruang lingkup Python mengatur visibilitas dan mutasi variabel.