Dalam banyak sumber saya menemukan "ruang lingkup" dan "ruang nama" digunakan secara bergantian, yang tampaknya sedikit membingungkan karena mereka bermakna berbeda.
- Lingkup mendefinisikan wilayah kode tempat nama tersedia.
- Aturan LEGB menentukan cara nama dilihat.
- Namespace adalah tempat Anda mencari nama.
Lalu saya membaca:
- "Nama-nama diikat ke namespace sesuai dengan tempat mereka ditugaskan ..." (yang saya percaya adalah kesepakatan dengan ruang lingkup dalam pelingkupan leksikal).
- "fungsi menambahkan lapisan namespace tambahan ke program Anda" [ ref. ] (bukankah mereka menambahkan lingkup lokal tambahan?)
- "Semua nama yang ditetapkan dalam definisi fungsi dimasukkan ke dalam ruang lingkup lokal (namespace yang terkait dengan panggilan fungsi)."
- "Ruang lingkup global - yaitu, namespace tempat variabel dibuat (ditugaskan) di tingkat atas file modul."
* semua kutipan berasal dari belajar python 5th edition ch17
Apakah ruang nama dalam Python cara lingkup diterapkan? Apakah mereka sama? Adakah yang bisa menyadarkan saya?
Jawaban:
Sebuah namespace adalah kamus, pemetaan nama (sebagai string) dengan nilai-nilai. Ketika Anda melakukan tugas, seperti
a = 1
, Anda sedang memutasi ruang nama. Ketika Anda membuat referensi, sepertiprint(a)
, Python melihat melalui daftar ruang nama untuk mencoba dan menemukan satu dengan nama sebagai kunci.Sebuah lingkup mendefinisikan yang ruang nama akan melihat ke dalam dan dalam rangka apa. Lingkup setiap referensi selalu dimulai di namespace lokal, dan bergerak ke luar hingga mencapai namespace global modul, sebelum pindah ke
builtins
(namespace yang mereferensikan fungsi dan konstanta Python yang telah ditentukan, sepertirange
dangetattr
), yang merupakan akhir dari baris .Bayangkan Anda memiliki fungsi bernama
inner
, bersarang di dalam fungsi global bernamaouter
, daninner
berisi referensi ke nama. Python pertama kali terlihat diinner
namespace. Jika namanya tidak ada, Python kemudian mencari diouter
namespace. Jika itu gagal, Python mencobaglobal
namespace modul , lalubuiltin
namespace, akhirnya melemparNameError
jika namanya tidak ditemukan.Ketika kita mengatakan
x
dalam namespace fungsi, kita berarti itu didefinisikan di sana, secara lokal di dalam fungsi. Ketika kita mengatakanx
berada dalam ruang lingkup fungsi, berarti kitax
berada di namespace fungsi atau di salah satu ruang nama luar yang fungsi namespace berada di dalam.Setiap kali Anda mendefinisikan suatu fungsi, Anda membuat namespace baru dan cakupan baru. Namespace adalah hash nama lokal yang baru. Cakupannya adalah rantai ruang nama tersirat yang dimulai pada namespace baru, kemudian bekerja melalui ruang nama luar (lingkup luar), hingga namespace global (lingkup global), dan terus ke builtin.
Istilah ini dapat digunakan hampir secara bergantian, tetapi itu bukan karena mereka memiliki arti yang sama; itu karena mereka tumpang tindih banyak dalam apa yang mereka maksudkan.
sumber
Ada artikel bagus tentang ruang nama Python di sini . Mengutip bagian yang relevan untuk menjawab pertanyaan Anda tentang referensi antara cakupan dan ruang nama:
Misalnya, bayangkan program die-rolling sederhana:
roll
memiliki namespace sendiri , tetapi nama-nama dalam namespace modul juga dalam ruang lingkup .sumber