Ruang Nama Python dan Skop Pembolehubah

Dalam tutorial ini, anda akan belajar tentang ruang nama, pemetaan dari nama ke objek, dan ruang lingkup pemboleh ubah.

Apakah Nama di Python?

Sekiranya anda pernah membaca 'The Zen of Python' (taipkan import thisjurubahasa Python), baris terakhir menyatakan, Namespaces adalah satu idea hebat - mari kita lakukan lebih banyak lagi! Jadi apa ruang nama misteri ini? Mari kita perhatikan dahulu nama apa.

Nama (juga disebut pengenal) hanyalah nama yang diberikan kepada objek. Semua yang ada di Python adalah objek. Nama adalah cara untuk mengakses objek yang mendasari.

Contohnya, semasa kita melakukan tugasan a = 2, 2adalah objek yang tersimpan dalam memori dan adalah nama yang kita kaitkan dengannya. Kita boleh mendapatkan alamat (dalam RAM) beberapa objek melalui fungsi terbina dalam id(). Mari lihat bagaimana menggunakannya.

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

Pengeluaran

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

Di sini, kedua-duanya merujuk pada objek yang sama 2, sehingga keduanya sama id(). Mari buat perkara menjadi 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))

Pengeluaran

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

Apa yang berlaku dalam urutan langkah di atas? Mari gunakan rajah untuk menerangkan ini:

Diagram memori pemboleh ubah di Python

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

Perhatikan bahawa id(a)dan id(3)mempunyai nilai yang sama.

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

Ini berkesan kerana Python tidak perlu membuat objek pendua baru. Sifat mengikat nama yang dinamik ini menjadikan Python kuat; nama boleh merujuk kepada jenis objek apa pun.

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

Semua ini adalah sah dan akan merujuk kepada tiga jenis objek dalam keadaan yang berbeza. Fungsi adalah objek juga, jadi nama dapat merujuknya juga.

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

Pengeluaran

 Helo

Nama yang sama a boleh merujuk pada fungsi dan kita dapat memanggil fungsi menggunakan nama ini.

Apakah ruang nama di Python?

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

Secara sederhana, ruang nama adalah kumpulan nama.

Di Python, anda dapat membayangkan ruang nama sebagai pemetaan setiap nama yang telah anda tetapkan pada objek yang sesuai.

Ruang nama yang berbeza dapat wujud bersama pada waktu tertentu tetapi terpencil sepenuhnya.

Ruang nama yang mengandungi semua nama terbina dalam dibuat semasa kita memulakan pentafsir Python dan wujud selagi jurubahasa berjalan.

Inilah sebabnya bahawa fungsi terbina dalam seperti id()dan print()lain-lain selalu tersedia untuk kita dari mana-mana bahagian program. Setiap modul mencipta ruang nama globalnya sendiri.

Ruang nama yang berbeza ini diasingkan. Oleh itu, nama yang sama yang mungkin terdapat dalam modul yang berbeza tidak bertembung.

Modul boleh mempunyai pelbagai fungsi dan kelas. Ruang nama tempatan dibuat apabila fungsi dipanggil, yang mempunyai semua nama yang ditentukan di dalamnya. Begitu juga dengan kelas. Gambar rajah berikut dapat membantu menjelaskan konsep ini.

Gambarajah ruang nama yang berlainan di Python

Skop Pemboleh ubah Python

Walaupun terdapat pelbagai ruang nama yang unik, kami mungkin tidak dapat mengakses semuanya dari setiap bahagian program. Konsep skop mula dimainkan.

Skop adalah bahagian program dari mana ruang nama dapat diakses secara langsung tanpa awalan.

Pada masa tertentu, terdapat sekurang-kurangnya tiga ruang lingkup bersarang.

  1. Skop fungsi semasa yang mempunyai nama tempatan
  2. Skop modul yang mempunyai nama global
  3. Skop terluar yang mempunyai nama terbina dalam

Apabila rujukan dibuat di dalam fungsi, namanya dicari di ruang nama tempatan, kemudian di ruang nama global dan akhirnya di ruang nama bawaan.

Sekiranya terdapat fungsi di dalam fungsi lain, ruang lingkup baru bersarang di dalam skop tempatan.

Contoh ruang lingkup dan ruang nama di Python

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

Di sini, pemboleh ubah a berada di ruang nama global. Pemboleh ubah b berada di ruang nama tempatan outer_function()dan c berada di ruang nama tempatan bersarang inner_function().

Semasa kita berada inner_function(), c adalah tempatan bagi kita, b tidak tempatan dan global. Kita boleh membaca dan memberikan nilai baru untuk c tetapi hanya dapat membaca b dan a dari inner_function().

Sekiranya kita cuba menetapkan sebagai nilai ke b, pemboleh ubah baru b dibuat di ruang nama tempatan yang berbeza daripada b bukan lokal. Perkara yang sama berlaku apabila kita memberikan nilai kepada a.

Namun, jika kita menyatakan sebagai global, semua rujukan dan tugas akan diserahkan kepada global a. Begitu juga, jika kita mahu membalikkan pemboleh ubah b, ia mesti dinyatakan sebagai tidak tempatan. Contoh berikut akan menjelaskan perkara ini dengan lebih lanjut.

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

 a = 30 a = 20 a = 10

Dalam program ini, tiga pemboleh ubah yang berbeza didefinisikan di ruang nama yang terpisah dan diakses sesuai. Semasa dalam 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 program adalah.

 a = 30 a = 30 a = 30 

Di sini, semua rujukan dan tugas diberikan kepada global kerana penggunaan kata kunci global.

Artikel menarik...