Zanurkuj w Pythonie/locals i globals: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
zaczynam tłumaczyć |
Nie podano opisu zmian |
||
Linia 13:
Nie, czekaj, nie mogłeś jeszcze się uczyć o <tt>locals</tt>. Najpierw, musisz nauczyć się, czym są przestrzenie nazw. Przedstawimy teraz trochę suchego materiału, lecz ważnego, dlatego też zachowaj uwagę.
Python korzysta z czegoś, co się nazywa przestrzenią nazw (ang. ''namespace''), aby śledzić zmienne. Przestrzeń nazw jest właśnie jak słownik, gdzie kluczami są nazwy zmienne, a wartościami słownika są wartości tych zmiennych. Właściwie możesz dostać się do przestrzeni nazw jak do Pythonowego słownika, co zresztą zobaczymy za chwilkę.
Z dowolnego miejsca Pythonowego programu mamy dostęp do kliku przestrzeni nazw. Każda funkcja posiada własną przestrzeń nazw, nazywaną ''lokalną przestrzenią nazw'', a która śledzi zmienne funkcji, włączając to jej argumenty i lokalnie zdefiniowane zmienne. Każdy moduł posiada własną przestrzeń nazw, nazwaną ''globalną przestrzenią nazw'', a która śledzi zmienne modułu, włączając to funkcje, klasy i inne zaimportowane moduły, a także zmienne zdefiniowane w tym module i stałe. Jest także wbudowana przestrzeń nazw, dostępna z każdego modułu, a która przechowuje funkcje wbudowane i wyjątki.
Kiedy pewna linia kodu pyta się o wartość zmiennej <tt>x</tt>, Python przeszuka wszystkie przestrzenie nazw, aby znaleść ją, w poniższym porządku:
# lokalna przestrzeń nazw - określona dla bieżącej funkcji lub metody pewnej klasy. Jeśli funkcja definiuje jakąś lokalną zmienną <tt>x</tt>, Python wykorzysta ją i zakończy szukanie.
# globalna przestrzeń nazw - określona dla bieżącego modułu. Jeśli moduł definiuje zmienną lub klasę o nazwie <tt>x</tt>, Python wykorzysta ją i zakończy szukanie.
# wbudowana przestrzeń nazw namespace - globalna dla wszystkich modułów. Ponieważ jest to ostatnia deska ratunku, Python przyjmie, że <tt>x</tt> jest nazwą wbudowanej funkcji lub zmiennej.
If Python doesn't find x in any of these namespaces, it gives up and raises a NameError with the message There is no variable named 'x', which you saw back in Example 3.18, “Referencing an Unbound Variable”, but you didn't appreciate how much work Python was doing before giving you that error.
|