W wielu zasobach stwierdziłem, że „zakres” i „przestrzenie nazw” są używane zamiennie, co wydaje się nieco mylące, ponieważ oznaczają różne rzeczy.
- Zakres określa region kodu, w którym dostępna jest nazwa.
- Reguła LEGB określa sposób wyszukiwania nazw.
- Przestrzeń nazw to miejsce, w którym wyszukujesz nazwiska.
Potem czytam:
- „nazwy są powiązane z przestrzenią nazw zgodnie z miejscem, w którym zostały przypisane ...” (moim zdaniem dotyczy to zakresów w zakresie leksykalnym).
- „funkcje dodają dodatkową warstwę przestrzeni nazw do twoich programów” [ ref. ] (czy nie dodają dodatkowego zasięgu lokalnego?)
- „wszystkie nazwy przypisane w definicji funkcji są umieszczane w zasięgu lokalnym (przestrzeń nazw powiązana z wywołaniem funkcji).”
- „zakres globalny - czyli przestrzeń nazw, w której zmienne utworzone (przypisane) na najwyższym poziomie pliku modułu są aktywne”.
* wszystkie cytaty pochodzą z nauki Pythona 5. edycja ch17
Czy przestrzenie nazw w Pythonie są zaimplementowane w zakresach? Czy to to samo? Czy ktoś może mnie oświecić?
Odpowiedzi:
Nazw jest słownikiem, mapowanie nazwy (ciągami znaków) do wartości. Kiedy wykonujesz zadanie, na przykład
a = 1
, mutujesz przestrzeń nazw. Kiedy tworzysz odwołanie, na przykładprint(a)
Python przegląda listę przestrzeni nazw, aby spróbować znaleźć taką z nazwą jako kluczem.A zakres określa, które nazw będą wyglądały i w jakiej kolejności. Zakres każdego odwołania zawsze zaczyna się w lokalnej przestrzeni nazw i przesuwa na zewnątrz, aż osiągnie globalną przestrzeń nazw modułu, zanim przejdzie do
builtins
(przestrzeni nazw, która odwołuje się do predefiniowanych funkcji i stałych Pythona, takich jakrange
igetattr
), która jest końcem linii .Wyobraź sobie, że masz funkcję o nazwie
inner
, zagnieżdżoną w nazwie funkcji globalnejouter
iinner
zawiera ona odwołanie do nazwy. Python najpierw szuka winner
przestrzeni nazw. Jeśli nie ma tam nazwy, Python następnie sprawdzaouter
przestrzeń nazw. Jeśli to się nie powiedzie, Python wypróbujeglobal
przestrzeń nazw modułu , a następniebuiltin
przestrzeń nazw, ostatecznie wyrzucając a,NameError
jeśli nazwa nie zostanie znaleziona.Kiedy mówimy, że
x
znajduje się w przestrzeni nazw funkcji, mamy na myśli, że jest ona zdefiniowana lokalnie w obrębie funkcji. Kiedy mówimy, żex
jest w zakresie funkcji, mamy na myślix
to , że znajduje się w przestrzeni nazw funkcji lub w dowolnej zewnętrznej przestrzeni nazw, w której jest zagnieżdżona przestrzeń nazw funkcji.Za każdym razem, gdy definiujesz funkcję, tworzysz nową przestrzeń nazw i nowy zakres. Przestrzeń nazw to nowy lokalny skrót nazw. Zakres jest implikowanym łańcuchem przestrzeni nazw, który rozpoczyna się w nowej przestrzeni nazw, a następnie przechodzi przez dowolne zewnętrzne przestrzenie nazw (zewnętrzne zakresy), aż do globalnej przestrzeni nazw (zakres globalny) i do wbudowanych.
Terminy mogą być używane prawie zamiennie, ale nie dlatego, że oznaczają to samo; to dlatego, że bardzo się pokrywają w tym, co sugerują.
źródło
Jest doskonały artykuł na Python nazw tutaj . Aby zacytować odpowiednią część, aby odpowiedzieć na pytanie dotyczące odniesienia między zakresami i przestrzeniami nazw:
Wyobraź sobie na przykład prosty program do walcowania matryc:
roll
ma własną przestrzeń nazw , ale nazwy w przestrzeni nazw modułu również są objęte zakresem .źródło