Wprowadzenie do zmiennych globalnych i lokalnych w Pythonie

Opublikowany: 2021-08-26

Python obsługuje zmienne w bardzo indywidualny sposób. Podczas gdy wiele języków programowania domyślnie traktuje zmienne jako globalne (chyba że są zadeklarowane jako lokalne), Python traktuje zmienne jako lokalne, chyba że zadeklarowane jest odwrotnie. Powodem, dla którego Python domyślnie traktuje zmienne jako lokalne, jest to, że używanie zmiennych globalnych jest ogólnie uważane za kiepską praktykę kodowania.

Tak więc podczas programowania w Pythonie, gdy definicja zmiennej występuje w funkcji, domyślnie są one lokalne. Wszelkie modyfikacje lub manipulacje dokonane na tej zmiennej w treści funkcji pozostaną tylko w zakresie tej funkcji. Innymi słowy, te zmiany nie zostaną odzwierciedlone w żadnej innej zmiennej poza funkcją, nawet jeśli zmienna ma taką samą nazwę jak zmienna funkcji. Wszystkie zmienne istnieją w zakresie funkcji, w której są zdefiniowane i przechowują tę wartość. Aby zdobyć praktyczne doświadczenie w zakresie zmiennych i projektów Pythona, wypróbuj nasze certyfikaty z dziedziny nauki danych wydane przez najlepsze uniwersytety z USA.

W tym artykule przyjrzyjmy się pojęciu zmiennych lokalnych i globalnych w Pythonie, a także sposobom definiowania zmiennych globalnych. Przyjrzymy się również zjawisku znanemu jako „zmienne nielokalne”.

Czytaj!

Spis treści

Zmienne globalne i lokalne w Pythonie

Spójrzmy na przykład, aby zrozumieć, jak wartości globalne mogą być używane w ciele funkcji w Pythonie:

Program:

def func():

drukuj (ciąg)

string = „Kocham Pythona!”

funkcja()

Wyjście

Kocham Pythona!

Jak widać, zmienna string ma wartość „Kocham Pythona!” przed wywołaniem funkcji func(). Ciało funkcji składa się tylko z instrukcji print. Ponieważ nie ma przypisania do zmiennej łańcuchowej w treści funkcji, zamiast tego przyjmie ona wartość zmiennej globalnej.

W rezultacie wynik będzie taki, jak globalna wartość zmiennej string, czyli w tym przypadku „Kocham Pythona!”.

Teraz zmieńmy wartość string wewnątrz funkcji func() i zobaczmy, jak wpływa ona na zmienne globalne:

Program:

def func():

string = „Kocham Javę!”

drukuj (ciąg)

string = „Kocham Pythona!”

funkcja()

drukuj (ciąg)

Wyjście:

Kocham Javę!

Kocham Pythona!

W powyższym programie zdefiniowaliśmy funkcję func(), a wewnątrz niej mamy zmienną string o wartości „Kocham Javę!”. Tak więc ta zmienna jest lokalna dla funkcji func(). Następnie mamy zmienną globalną, jak wcześniej, a następnie wywołujemy funkcję i instrukcję print. Najpierw funkcja jest wywoływana, wywołując instrukcję print tej funkcji i dostarczając wynik „Kocham Javę!” – która jest zmienną lokalną dla tej funkcji. Następnie, gdy program znajdzie się poza zakresem funkcji, wartość s zostaje zmieniona na „Kocham Pythona” i dlatego otrzymujemy oba wiersze jako dane wyjściowe.

Teraz dodajmy pierwsze dwa przykłady i spróbujmy uzyskać dostęp do łańcucha za pomocą instrukcji print, a następnie spróbujmy przypisać mu nową wartość. Zasadniczo staramy się stworzyć ciąg znaków zarówno jako zmienną lokalną, jak i globalną.

Na szczęście Python nie dopuszcza tego zamieszania i zgłasza błąd. Oto jak:

Program:

def func():

drukuj (ciąg)

string = „Kocham Javę!”

drukuj (ciąg)

string = „Kocham Pythona!”

funkcja()

Wyjście (błąd):

——————————————————————————

UnboundLocalError Traceback (ostatnie połączenie jako ostatnie)

<ipython-input-3-d7a23bc83c27> w <module>

5

6 string = „Kocham Pythona!”

—-> 7 funkcji()

<ipython-input-3-d7a23bc83c27> w func()

1 def func():

—-> 2 print(ciąg)

3 string = „Kocham Javę!”

4 nadruk (ciąg)

5

UnboundLocalError: zmienna lokalna 's' przywoływana przed przypisaniem

Najwyraźniej Python nie pozwala, aby zmienna była zarówno globalna, jak i lokalna wewnątrz funkcji. Daje nam więc zmienną lokalną, ponieważ przypisujemy wartość do ciągu w funkcji func(). W rezultacie pierwsza instrukcja print pokazuje powiadomienie o błędzie. Wszystkie zmienne utworzone lub zmienione w zakresie dowolnej funkcji są lokalne, chyba że zostały wyraźnie zadeklarowane jako „globalne”.

Definiowanie zmiennych globalnych w Pythonie

Słowo kluczowe global jest potrzebne do poinformowania Pythona, że ​​uzyskujemy dostęp do zmiennych globalnych. Oto jak:

Program:

def func():

globalny ciąg

drukuj (ciąg)

string = „Ale ja też chcę nauczyć się Pythona!”

drukuj (ciąg)

string = „Chcę nauczyć się Javy!”

funkcja()

drukuj (ciąg)

Wyjście:

Chcę nauczyć się Javy!

Ale chcę też nauczyć się Pythona!

Ale chcę też nauczyć się Pythona!

Jak widać z danych wyjściowych, Python rozpoznaje tutaj zmienne globalne i odpowiednio ocenia instrukcję print, dając odpowiednie dane wyjściowe.

Używanie zmiennych globalnych w funkcjach zagnieżdżonych

Przyjrzyjmy się teraz, co się stanie, jeśli zmienne globalne zostaną użyte w funkcjach zagnieżdżonych. Sprawdź ten przykład, w którym zmienna „język” jest definiowana i używana w różnych zakresach:

Program:

def func():

język = „angielski”

def func1():

globalny język

język = „hiszpański”

print(„Przed wywołaniem func1: ” + język)

print("Dzwonienie func1 teraz:")

func1()

print(„Po wywołaniu func1: ” + język)

funkcja()

print(„Wartość języka w głównym: ” + język)

Wyjście:

Przed wywołaniem func1: angielski

Dzwonię teraz do func1:

Po wywołaniu func1: angielski

Wartość języka w głównych: hiszpański

Jak widać, słowo kluczowe global użyte w zagnieżdżonej funkcji func1 nie ma wpływu na zmienną „język” funkcji nadrzędnej. Oznacza to, że wartość jest zachowywana jako „angielski”. Pokazuje to również, że po wywołaniu funkcji func() w przestrzeni nazw modułu istnieje zmienna „język” o wartości „Hiszpański”.

To odkrycie jest zgodne z tym, co odkryliśmy w poprzedniej sekcji – że zmienna zdefiniowana w ciele funkcji jest zawsze lokalna, chyba że określono inaczej. Powinien jednak istnieć mechanizm dostępu do zmiennych należących również do różnych innych zakresów.

Tutaj wkraczają zmienne nielokalne!

Zmienne nielokalne

Zmienne nielokalne to nowe rodzaje zmiennych wprowadzone przez Python3. Mają one wiele wspólnego ze zmiennymi globalnymi i są również niezwykle ważne. Jednak jedną różnicą między zmiennymi nielokalnymi i globalnymi jest to, że zmienne nielokalne nie umożliwiają zmiany zmiennych z zakresu modułu.

Sprawdź poniższe przykłady, aby to zrozumieć:

Program:

def func():

globalny język

drukuj (język)

język = „niemiecki”

funkcja()

Wyjście:

Niemiecki

Zgodnie z oczekiwaniami program zwraca jako wynik „Frankfurt”. Teraz zmieńmy „globalny” na „nielokalny” i zobaczmy, co się stanie:

Program:

def func():

język nielokalny

drukuj (język)

język = „niemiecki”

funkcja()

Wyjście:

Plik „<ipython-input-9-97bb311dfb80>”, wiersz 2

język nielokalny

^

SyntaxError: nie znaleziono powiązania dla nielokalnego „języka”

Jak widać, powyższy program zgłasza błąd składni. Możemy stąd zrozumieć, że przypisania nielokalne można wykonać tylko z definicji funkcji zagnieżdżonych. Zmienne nielokalne powinny być zdefiniowane w zasięgu funkcji, a jeśli tak nie jest, nie może ona również znaleźć swojej definicji w zakresie zagnieżdżonym. Teraz sprawdź następujący program:

Program:

def func():

język = „angielski”

def func1():

język nielokalny

język = „niemiecki”

print(„Przed wywołaniem func1: ” + język)

print("Dzwonienie func1 teraz:")

func1()

print(„Po wywołaniu func1: ” + język)

język = „hiszpański”

funkcja()

print(„'język' w main: ” + język)

Wyjście:

Przed wywołaniem func1: angielski

Dzwonię teraz do func1:

Po wywołaniu func1: niemiecki

„język” w głównym: hiszpański

Powyższy program działa, ponieważ zmienna 'język' została zdefiniowana przed wywołaniem funkcji func1(). Jeśli nie jest zdefiniowany, otrzymamy błąd jak poniżej:

Program:

def func():

#język = „angielski”

def func1():

język nielokalny

język = „niemiecki”

print(„Przed wywołaniem func1: ” + język)

print("Dzwonienie func1 teraz:")

func1()

print(„Po wywołaniu func1: ” + język)

język = „hiszpański”

funkcja()

print(„'język' w main: ” + język)

Wyjście:

Plik „<ipython-input-11-5417be93b6a6>”, wiersz 4

język nielokalny

^

SyntaxError: nie znaleziono powiązania dla nielokalnego „języka”

Jednak program będzie działał dobrze, jeśli zastąpimy nielokalne globalnym:

Program:

def func():

#język = „angielski”

def func1():

globalny język

język = „niemiecki”

print(„Przed wywołaniem func1`: ” + język)

print("Dzwonienie func1 teraz:")

func1()

print(„Po wywołaniu func1: ” + język)

język = „hiszpański”

funkcja()

print(„'język' w main: ” + język)

Wyjście:

Przed wywołaniem func1: angielski

Dzwonię teraz do func1:

Po wywołaniu func1: niemiecki

„język” w głównym: niemiecki

Jeśli zauważysz, w powyższym programie zmienia się również wartość zmiennej globalnej (język)! To jest moc, jaką niosą ze sobą zmienne nielokalne!

Na zakończenie

W tym artykule omówiliśmy zmienne lokalne, globalne i nielokalne w Pythonie, a także różne przypadki użycia i możliwe błędy, na które należy zwrócić uwagę. Mając tę ​​wiedzę po swojej stronie, możesz zacząć ćwiczyć z różnymi rodzajami zmiennych i zauważać subtelne różnice.

Python jest niezwykle popularnym językiem programowania na całym świecie – zwłaszcza jeśli chodzi o rozwiązywanie problemów i wyzwań związanych z danymi. W upGrad mamy bazę uczących się w ponad 85 krajach, z ponad 40 000 opłacanymi uczniami na całym świecie, a nasze programy wpłynęły na ponad 500 000 pracujących profesjonalistów. Nasze kursy z zakresu nauki o danych i uczenia maszynowego zostały zaprojektowane, aby pomóc zmotywowanym uczniom z dowolnego środowiska rozpocząć swoją podróż i osiągnąć sukces w dziedzinie nauki o danych. Nasza 360-stopniowa pomoc w karierze gwarantuje, że po zarejestrowaniu się u nas Twoja kariera posuwa się tylko w górę. Skontaktuj się z nami już dziś i poznaj moc uczenia się partnerskiego i globalnego networkingu!

Jakie są typy zmiennych w Pythonie?

W oparciu o ich zakres, zmienne w Pythonie są albo lokalne, globalne, albo nielokalne.

Czy do zmiennych globalnych w Pythonie można uzyskać dostęp z poziomu funkcji?

Tak, do zmiennych globalnych można uzyskać dostęp z poziomu funkcji w Pythonie.

Jaka jest różnica między zmiennymi lokalnymi a globalnymi?

Zmienne globalne mają za zasięg cały program, podczas gdy zmienne lokalne mają tylko tę funkcję, w której są zdefiniowane jako ich zasięg.