Qeyri-lokal dəyişənlər

Yuxarıdakı misalda əsas proqram, funksiya və daxili funksiyada fərqli dəyişənlərdən istifadə etdik. Bəs, görəsən, eyniadlı dəyişənlərdən istifadə etsəydik, nə baş verərdi?

>>> def outer(): 
        def inner():
            x = 2
            print("inner:", x) 
        
        x = 1
        inner() 
        print("outer:", x)


>>> x = 0
>>> outer()
inner: 2
outer: 1
>>> print("global:", x) 
global: 0
>>>

Öncə də qeyd etdiyimiz kimi, üst səviyyədə elan olunan dəyişənlər aşağı səviyyədə yenidən təyin ediləndə onlar lokallaşdırılmış olur. Məhz bu səbəbdən proqramın x qlobal dəyişəninin qiyməti dəyişməz qaldı və eyni məntiqlə də outer() funksiyası daxilində təyin edilən x dəyişəni öz qiymətini saxlamış oldu.
Xatırlayırsınızsa, biz qlobal dəyişənin qiymətini funksiya daxilində dəyişə bilmək üçün global açar sözündən istifadə edirdik. Daxili funksiya içərisində də üst (xarici) funksiya dəyişəninin qiymətini nonlocal açar sözündən istifadə etməklə dəyişmək mümkündür:

>>> def outer(): 
        def inner():
            nonlocal x
            x = 2 
            print("inner:", x)
        
        x = 1
        inner() 
        print("outer:", x)


>>> x = 0
>>> outer()
inner: 2
outer: 2
>>> print("global:", x) 
global: 0
>>>

Beləliklə, qeyri-lokal (nonlocal) dəyişənlər lokal təsir sahəsində təyin olunmayan dəyişənlərdir. Eyni zamanda, misaldan da gördüyünüz kimi, onlar qlobal da deyildir. Bu cür dəyişənlərdən, əsasən, iç-içə və anonim funksiyalarda istifadə olunur.
Sonda onu da qeyd edək ki, daxili funksiya içərisindən də qlobal dəyişənin qiymətini dəyişmək mümkündür. Bunun üçün yenə də global açar sözündən istifadə edilməlidir:

>>> def outer(): 
        def inner():
            global x
            x = 2 
            print("inner:", x)

        x = 1
        inner() 
        print("outer:", x)


>>> x = 0
>>> outer()
inner: 2
outer: 1
>>> print("global:", x) 
global: 2
>>>

Qeyri-lokal dəyişənlər” üçün bir şərh

Şərh üçün bağlıdır.