Z lektury dokumentacji rozumiem, że Python ma osobną przestrzeń nazw dla funkcji i jeśli chcę użyć zmiennej globalnej w tej funkcji, muszę jej użyć global
.
Używam Python 2.7 i próbowałem tego małego testu
>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
... return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'
Wygląda na to, że wszystko działa dobrze nawet bez global
. Byłem w stanie uzyskać dostęp do zmiennej globalnej bez żadnego problemu.
Czy coś mi brakuje? Ponadto, z dokumentacji Pythona:
Nazw wymienionych w instrukcji globalnej nie wolno definiować jako parametrów formalnych ani w celu kontroli pętli for, definicji klasy, definicji funkcji lub instrukcji importu.
Chociaż formalne parametry i definicja klasy mają dla mnie sens, nie jestem w stanie zrozumieć ograniczenia dotyczącego celu kontroli pętli i definicji funkcji.
def foo(): ...
ifoo = ...
jednocześnie). Tworzy nowy zakres dla każdego wywołania funkcji. (Ale czym to się różni od każdego innego zdalnie wysokiego poziomu języka na świecie?)Odpowiedzi:
Słowo kluczowe
global
jest przydatne tylko do zmiany lub tworzenia zmiennych globalnych w kontekście lokalnym, chociaż tworzenie zmiennych globalnych rzadko jest uważane za dobre rozwiązanie.Powyższe daje ci:
Natomiast jeśli użyjesz
global
instrukcji, zmienna stanie się dostępna „poza” zakresem funkcji, skutecznie tworząc zmienną globalną.Powyższy kod da ci:
Ponadto, ze względu na naturę Pythona, można również używać
global
do deklarowania funkcji, klas lub innych obiektów w kontekście lokalnym. Chociaż odradzałbym to, ponieważ powoduje koszmary, jeśli coś pójdzie nie tak lub wymaga debugowania.źródło
globals
zdefiniowany automatycznie we wszystkich przestrzeniach nazw (na szczęście). Jak słusznie zauważyłeś, globalny jest powiązany z przestrzenią nazw w module, jednak można go zaimportować do innego modułu jakofrom module import variable
lubimport module.variable
. W pierwszym przypadku import spowodowałby, że zmienna byłaby dostępna jakovariable
bez wymagania odniesienia jakomodule.
. Jeśli zostanie uznany za globalny, zakres modułu zależy od tego, gdzie jest importowany. Zobacz takżenonlocal
jako nowe słowo kluczowe związane z zakresem w python 3.Chociaż możesz uzyskać dostęp do zmiennych globalnych bez
global
słowa kluczowego, jeśli chcesz je zmodyfikować, musisz użyćglobal
słowa kluczowego. Na przykład:W twoim przypadku po prostu uzyskujesz dostęp do listy
sub
.źródło
foo = 3
bez globalnego działania, ale foo jest ponownie zdefiniowane lokalnie wblub
zakresie funkcji i nie modyfikuje oryginalnej zmiennej foo. To było dla mnie dość mylące.Jest to różnica między dostępem do nazwy a powiązaniem jej w zakresie.
Jeśli szukasz tylko zmiennej, aby odczytać jej wartość, masz dostęp do zasięgu globalnego i lokalnego.
Jeśli jednak przypiszesz zmienną, której nazwa nie jest w zasięgu lokalnym, wiążesz tę nazwę z tym zakresem (a jeśli ta nazwa istnieje również jako globalna, ukryjesz ją).
Jeśli chcesz mieć możliwość przypisania nazwy globalnej, musisz powiedzieć parserowi, aby używał nazwy globalnej, a nie przypisywać nową nazwę lokalną - to właśnie robi słowo kluczowe „global”.
Powiązanie w dowolnym miejscu bloku powoduje związanie nazwy w tym bloku, co może powodować dość dziwnie wyglądające konsekwencje (np. Niespodziewane pojawienie się UnboundLocalError we wcześniej działającym kodzie).
źródło
Inne odpowiedzi odpowiadają na twoje pytanie. Inną ważną rzeczą, którą należy wiedzieć o nazwach w Pythonie, jest to, że są one lokalne lub globalne dla poszczególnych zakresów.
Rozważ to, na przykład:
Prawdopodobnie można się domyślić, że
value = 0
instrukcja zostanie przypisana do zmiennej lokalnej i nie wpłynie na wartość tej samej zmiennej zadeklarowanej pozadoit()
funkcją. Możesz być bardziej zaskoczony, gdy odkryjesz, że powyższy kod nie działa. Instrukcjaprint value
wewnątrz funkcji tworzyUnboundLocalError.
Powodem jest to, że Python zauważył, że gdzie indziej w funkcji przypisujesz nazwę
value
, a takżevalue
nigdzie nie jest zadeklarowanaglobal
. To sprawia, że jest to zmienna lokalna. Ale kiedy próbujesz go wydrukować, nazwa lokalna nie została jeszcze zdefiniowana. Python w tym przypadku nie wraca do szukania nazwy jako zmiennej globalnej, podobnie jak niektóre inne języki. Zasadniczo nie można uzyskać dostępu do zmiennej globalnej, jeśli zdefiniowano zmienną lokalną o tej samej nazwie w dowolnym miejscu funkcji.źródło
global
(lubnonlocal
w Python 3.x) zastępuje to zachowanie i pozwala na ponowne przypisanie nazwy zewnętrznej.let
są podnoszone.global
czy to nie ma znaczenia?Dostęp do nazwy i przypisanie nazwy są różne. W twoim przypadku po prostu uzyskujesz dostęp do nazwy.
Jeśli przypiszesz zmienną do funkcji, zakłada się, że zmienna ta jest lokalna, chyba że zadeklarujesz ją jako globalną. W przypadku braku tego zakłada się, że ma charakter globalny.
źródło
global
Przykład:
źródło
Zakłada się, że każda zmienna zadeklarowana poza funkcją jest globalna, tylko wtedy, gdy deklaruje się ją z wnętrza funkcji (z wyjątkiem konstruktorów), należy określić, że zmienna jest globalna.
źródło
Wyjaśniono to dobrze w FAQ Pythona
https://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python
źródło
Oznacza to, że nie powinieneś wykonywać następujących czynności:
źródło
Globalny sprawia, że zmienna „Globalna”
To sprawia, że „x” działa jak normalna zmienna poza funkcją. Jeśli wyjmiesz globalny, spowoduje to błąd, ponieważ nie może wydrukować zmiennej wewnątrz funkcji.
źródło