PYTHON

PYTHON Zasięg zmiennych

Przykład:

def fun1():
    x = 7
    print('Wartość x wewnątrz funkcji:',x)

x = 10
fun1()
print('Wartość x poza funkcją:',x)

Efekt:

Wartość x wewnątrz funkcji: 7
Wartość x poza funkcją: 10

Zmienne posiadają swój zasięg. Jest nim obszar programu, w jakim ich wartość jest możliwa do wykorzystania. I tak zmienne funkcyjne, tworzone wewnątrz funkcji mają zasięg obszaru funkcji, a zmienne globalne mają zasięg całego programu. Zmienne funkcyjne o tej samej nazwie co zmienne globalne na obszarze funkcji mają przed nimi pierwszeństwo.

Jeśli program chce uzyskać wartość zmiennej korzysta z pewnej kolejności ważności zmiennych. Są to kolejno:

  1. Zmienna lokalna – zadeklarowana wewnątrz funkcji czy metody
  2. Zmienna zadeklarowana w metodzie nadrzędnej (w przypadku zagnieżdżenia funkcji)
  3. Zmienna globalna
  4. Zmienna wbudowana

W naszym przykładzie mamy dwie wartości zmiennej x. Pierwsza x = 10 zadeklarowane na początku programu, kolejne x = 7 zadeklarowane wewnątrz funkcji. Nietrudno się domyśleć, że wypisanie wartości x wewnątrz funkcji da wynik 7, natomiast na zewnątrz wynik 10.

Co jednak jeśli wewnątrz funkcji nie zadeklarujemy wartości x, natomiast spróbujemy ją wypisać na ekran?

def fun1():
    print('Wartość x wewnątrz funkcji:',x)

x = 10
fun1()
print('Wartość x poza funkcją:',x)

Efekt:

Wartość x wewnątrz funkcji: 10
Wartość x poza funkcją: 10

Program szukał lokalnej wartości x. Nie znalazł jej. W związku z tym przeszedł do poszukiwań w kolejnych obszarach. Wartość x wewnątrz funkcji jest taka sama jak na zewnątrz jej.

Podobnie ma się sprawa wewnątrz zagnieżdżonych funkcji.

def fun1():
    x=5
    print('Wartość x wewnątrz funkcji 1:',x)
    fun2()

def fun2():
    x = 3
    print('Wartość x wewnątrz funkcji 2:',x)

x = 10
fun1()
print('Wartość x poza funkcją:',x)

Efekt:

Wartość x wewnątrz funkcji 1: 5
Wartość x wewnątrz funkcji 2: 3
Wartość x poza funkcją: 10

Natomiast jeśli wewnątrz funkcji 2 nie zadeklarujemy wartości zmiennej x:

def fun1():
    def fun2():
        print('Wartość x wewnątrz funkcji 2:',x)
    x=5
    print('Wartość x wewnątrz funkcji 1:',x)
    fun2()

x = 10
fun1()
print('Wartość x poza funkcją:',x)

Efekt:

Wartość x wewnątrz funkcji 1: 5
Wartość x wewnątrz funkcji 2: 5
Wartość x poza funkcją: 10