Ruang Nama Python dan Cakupan Variabel

Dalam tutorial ini, Anda akan belajar tentang namespace, pemetaan dari nama ke objek, dan cakupan variabel.

Apa Nama di Python?

Jika Anda pernah membaca 'The Zen of Python' (ketik import thisinterpreter Python), baris terakhir menyatakan, Namespaces adalah salah satu ide bagus - mari kita lakukan lebih banyak lagi! Jadi apa namespace misterius ini? Mari kita lihat dulu apa namanya.

Nama (juga disebut pengenal) hanyalah nama yang diberikan ke objek. Segala sesuatu di Python adalah sebuah objek. Nama adalah cara untuk mengakses objek yang mendasarinya.

Misalnya, ketika kita melakukan tugas a = 2, 2adalah objek yang disimpan dalam memori dan adalah nama yang kita kaitkan dengannya. Kita bisa mendapatkan alamat (dalam RAM) dari beberapa objek melalui fungsi built-in id(). Mari kita lihat bagaimana cara menggunakannya.

 # Note: You may get different values for the id a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))

Keluaran

 id (2) = 9302208 id (a) = 9302208

Di sini, keduanya merujuk pada objek yang sama 2, jadi keduanya memiliki kesamaan id(). Mari kita buat sedikit lebih menarik.

 # Note: You may get different values for the id 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))

Keluaran

 id (a) = 9302208 id (a) = 9302240 id (3) = 9302240 id (b) = 9302208 id (2) = 9302208

Apa yang terjadi dalam urutan langkah di atas? Mari gunakan diagram untuk menjelaskan ini:

Diagram memori variabel dengan Python

Awalnya, sebuah objek 2dibuat dan nama a dikaitkan dengannya, ketika kita melakukannya a = a+1, objek baru 3dibuat dan sekarang a dikaitkan dengan objek ini.

Perhatikan itu id(a)dan id(3)memiliki nilai yang sama.

Selanjutnya, ketika b = 2dijalankan, nama baru b akan diasosiasikan dengan objek sebelumnya 2.

Ini efisien karena Python tidak harus membuat objek duplikat baru. Sifat dinamis dari pengikatan nama ini membuat Python kuat; sebuah nama bisa merujuk ke semua jenis objek.

 >>> a = 5 >>> a = 'Hello World!' >>> a = (1,2,3)

Semua ini valid dan akan mengacu pada tiga jenis objek yang berbeda dalam contoh yang berbeda. Fungsi adalah objek juga, jadi sebuah nama juga bisa merujuk padanya.

 def printHello(): print("Hello") a = printHello a()

Keluaran

 Halo

Nama yang sama a dapat merujuk ke suatu fungsi dan kita dapat memanggil fungsi tersebut menggunakan nama ini.

Apa itu Namespace dengan Python?

Sekarang setelah kita memahami apa itu nama, kita dapat beralih ke konsep ruang nama.

Sederhananya, namespace adalah kumpulan nama.

Dengan Python, Anda dapat membayangkan namespace sebagai pemetaan dari setiap nama yang Anda tentukan ke objek terkait.

Ruang nama yang berbeda dapat hidup berdampingan pada waktu tertentu tetapi terisolasi sepenuhnya.

Sebuah namespace yang berisi semua nama built-in dibuat ketika kita memulai interpreter Python dan ada selama interpreter berjalan.

Inilah alasan mengapa fungsi bawaan seperti id(), print()dll. Selalu tersedia bagi kami dari bagian mana pun dari program. Setiap modul membuat namespace globalnya sendiri.

Ruang nama yang berbeda ini diisolasi. Karenanya, nama yang sama yang mungkin ada di modul berbeda tidak bertabrakan.

Modul dapat memiliki berbagai fungsi dan kelas. Namespace lokal dibuat saat sebuah fungsi dipanggil, yang memiliki semua nama yang ditentukan di dalamnya. Serupa, halnya dengan kelas. Diagram berikut dapat membantu memperjelas konsep ini.

Diagram ruang nama yang berbeda dengan Python

Cakupan Variabel Python

Meskipun ada berbagai ruang nama unik yang ditentukan, kita mungkin tidak dapat mengakses semuanya dari setiap bagian program. Konsep ruang lingkup mulai berlaku.

Cakupan adalah bagian dari program tempat namespace dapat diakses secara langsung tanpa awalan apa pun.

Pada saat tertentu, setidaknya ada tiga cakupan bersarang.

  1. Lingkup fungsi saat ini yang memiliki nama lokal
  2. Cakupan modul yang memiliki nama global
  3. Cakupan terluar yang memiliki nama bawaan

Ketika referensi dibuat di dalam suatu fungsi, namanya dicari di namespace lokal, lalu di namespace global dan terakhir di namespace bawaan.

Jika ada fungsi di dalam fungsi lain, cakupan baru ditempatkan di dalam lingkup lokal.

Contoh Ruang Lingkup dan Namespace dengan Python

 def outer_function(): b = 20 def inner_func(): c = 30 a = 10

Di sini, variabel a ada di namespace global. Variabel b ada di namespace lokal outer_function()dan c di namespace lokal bersarang inner_function().

Saat kita berada inner_function(), c bersifat lokal bagi kita, b nonlokal dan a global. Kita dapat membaca serta memberikan nilai baru ke c tetapi hanya dapat membaca b dan a dari inner_function().

Jika kita mencoba untuk menetapkan sebagai nilai ke b, variabel baru b dibuat di namespace lokal yang berbeda dari b nonlokal. Hal yang sama terjadi ketika kita menetapkan nilai ke a.

Namun, jika kita mendeklarasikan sebagai global, semua referensi dan penugasan pergi ke global a. Demikian pula, jika kita ingin me-rebind variabel b, itu harus dideklarasikan sebagai nonlokal. Contoh berikut akan menjelaskan hal ini lebih jauh.

 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)

Seperti yang Anda lihat, output dari program ini adalah

 a = 30 a = 20 a = 10

Dalam program ini, tiga variabel berbeda a didefinisikan dalam ruang nama terpisah dan diakses sesuai dengan itu. Saat mengikuti program berikut,

 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 dari program ini adalah.

 a = 30 a = 30 a = 30 

Di sini, semua referensi dan tugas bersifat global karena penggunaan kata kunci global.

Artikel yang menarik...