CodeGym /Kurslar /Python SELF AZ /Dəyişənlərin görünüş sahələri

Dəyişənlərin görünüş sahələri

Python SELF AZ
Səviyyə , Dərs
Mövcuddur

10.1 Funksiyaların lokal dəyişənləri

Python-da dəyişən onun yaradıldığı andan başlayaraq və öz görünüş sahəsinin sonuna qədər əlçatandır — bu, əksər hallarda onun elan edildiyi funksiyadır. Əgər dəyişən bütün funksiyaların xaricində elan edilibsə, o zaman bu dəyişən qlobal adlanır.

Python-da dəyişənlərin görünüş sahələri, dəyişənlərin hansı kontekstdə istifadə üçün əlçatan olduğunu müəyyən edir. Görünüş sahələri ad ziddiyyətlərinin qarşısını almağa və verilənlərə girişə nəzarət etməyə kömək edir. Python-da başlıca görünüş sahələri bunlardır:

Lokal görünüş sahəsi: Funksiya daxilində yaradılan dəyişənlər, həmin funksiyanın lokal görünüş sahəsinə aiddir və yalnız o funksiya daxilində əlçatandır.

Daxili funksiyaların görünüş sahəsi: Əgər funksiya başqa bir funksiyanın daxilində təyin edilibsə, onun dəyişənləri yalnız həmin daxili funksiyada əlçatandır.

Qlobal görünüş sahəsi: Skript və ya modul səviyyəsində müəyyən edilmiş dəyişənlər, qlobal hesab olunur və həmin modulun istənilən hissəsində əlçatandır.

Daxili (Built-in) görünüş sahəsi: Bu, xüsusi bir görünüş sahəsidir və Python-un bütün daxili obyektlərini və funksiyalarını (məsələn, print() və len()) əhatə edir.

LEGB Qaydası

Dəyişənlərin həll olunması üçün Python LEGB qaydasından istifadə edir, bu qayda interpretatorun dəyişənləri hansı ardıcıllıqla axtardığını müəyyən edir:

  • L (Local) — Əvvəlcə lokal görünüş sahəsində.
  • E (Enclosed) — Sonra bütün daxili funksiyaların görünüş sahələrində, ən yaxından xaricə doğru.
  • G (Global) — Daha sonra qlobal görünüş sahəsində.
  • B (Built-in) — Nəhayət, daxili görünüş sahəsində.

İstifadə nümunələri


x = "global"  # Qlobal dəyişən

def outer():
    y = "outer local"  # Xarici funksiyanın lokal dəyişəni
    def inner():
        z = "inner local"  # Daxili funksiyanın lokal dəyişəni
        print(x)  # "global" çap edir
        print(y)  # "outer local" çap edir
        print(z)  # "inner local" çap edir
    inner()

outer()

z dəyişəni yalnız inner() funksiyası daxilində əlçatandır.

y dəyişəni outer() funksiyası daxilində və onun daxilində elan edilmiş bütün funksiyalarda əlçatandır.

x dəyişəni cari faylda (modulda) hər yerdə əlçatandır.

10.2 Qlobal dəyişənlərə giriş: global x

Python dilinin maraqlı bir xüsusiyyəti odur ki, xarici görünürlük sahələrindəki dəyişənləri (hansı ki, cari sahənin içərisinə daxildir) yalnız oxumaq mümkündür.

Xarici dəyişənə hər hansı bir məlumat yazmağa cəhd etdikdə, eyni adda lokal dəyişən yaranacaq və xarici dəyişənə giriş itiriləcək.

Nümunə:


x = 10

def change_global():
    print(x)  # Bu xətaya səbəb olacaq, çünki təyin etmədən sonra x lokal dəyişən sayılacaq
    x = 20  # Burada lokal x adlı dəyişən yaradılır
    print(x)  # 20-ni göstərəcək (lokal dəyişən x-ə müraciət gedir)
        
change_global()
print(x)  # 10-u göstərəcək

Bu nümunə işləmir və UnboundLocalError xətası verəcək, çünki Python interpretatoru ilk olaraq x = 20 təyin etməsini görür və x-i lokal dəyişən hesab edir. Amma, print(x) sətrinə çatanda, lokal x dəyişəni tapılmır, çünki o hələ müəyyən edilməyib.

Bu, təhlükəsizliyə görə belə edilib ki, lokal dəyişənlər təsadüfən qlobal dəyişənləri dəyişməsin.

global operatoru

Əgər siz qəsdən funksiyanın içərisində qlobal dəyişənin dəyərini dəyişmək istəyirsinizsə, bunun üçün global operatorundan istifadə edə bilərsiniz. Bu operator dəqiq bildirir ki, dəyişiklik məhz qlobal dəyişəndə yer alacaq, lokalda yox.

Bir funksiyanın daxilində qlobal dəyişənin dəyərini dəyişmək üçün, onu funksiyanın əvvəlində global operatoru ilə elan etmək lazımdır. Bu, funksiya üçün həmin dəyişənə yazma girişini təmin edir:


x = 10

def change_global():
    global x  # x-i qlobal dəyişən kimi elan edirik
    print(x)  # 10-u göstərəcək (qlobal dəyişən x-ə müraciət gedir)
    x = 20  # Burada qlobal dəyişən x-ə yeni dəyər təyin olunur
    print(x)  # 20-ni göstərəcək (qlobal dəyişən x-ə müraciət gedir)

change_global()
print(x)  # 20-ni göstərəcək

global operatorundan istifadə edərək xətadan yayına və qlobal dəyişənləri düzgün idarə edə bilərsiniz.

Qlobal dəyişənlər proqramı daha az proqnozlaşdırılan və anlaşılan edə bilər, çünki onların dəyərləri proqramın istənilən yerində dəyişdirilə bilər. Bu, xüsusən də proqram böyükdürsə və bir qrup proqramçı tərəfindən hazırlanırsa, kritik ola bilər.

Bəzi hallarda qlobal dəyişənlərdən istifadə qaçılmazdır, lakin onların tətbiqini maksimum azaltmağa çalışmaq yaxşı olardı. Qlobal dəyişənlər əvəzinə funksiyaların parametrləri, qaytarılan dəyərlər və vəziyyəti saxlamaq üçün siniflərin istifadəsini düşünün.

Qlobal dəyişənlərdən istifadə gözlənilməz yan təsirlərə, kodun çətin debug olunmasına və test edilməsinə, həmçinin təkrar istifadəsinin az olmasına gətirib çıxara bilər. Buna görə də, qlobal dəyişənlərdən ehtiyatla istifadə edilməli və yalnız həqiqətən lazım olanda tətbiq edilməlidir.

10.3 Lokal olmayan dəyişənlərə giriş: nonlocal

Python-da qlobal və lokal dəyişənlərdən başqa, aralıq görünürlük sahələrinin dəyişənləri mövcuddur. Məsələn, bir funksiya digər funksiyanın içərisində yerləşdirildiyi zaman. Belə dəyişənlərlə işləmək üçün nonlocal operatorundan istifadə olunur.

nonlocal operatoru daxili funksiyalarda dəyişənlərlə işləməyə imkan yaradır, onların dəyərlərini ən yaxın görünürlük sahəsində dəyişir, qlobal dəyişənləri istisna edir.

nonlocal operatoru xarici funksiyada təyin olunan dəyişəni dəyişdirmək lazım olduğu zaman, daxili funksiyada yeni lokal dəyişən yaradılmasının qarşısını alır. nonlocal istifadə etmədən bu dəyişikliklər yalnız daxili funksiyanın lokal dəyişəninə təsir edər və xarici funksiyadakı dəyişənə təsir etməz.

Nümunə:


def outer():
    count = 0

    def inner():
        nonlocal count
        count += 1
        return count

    return inner

counter = outer()
print(counter())  # 1 çap edəcək

Budur nonlocal operatorunun sayğac yaratmaq üçün praktik bir nümunəsi:


def create_counter():
    count = 0
    
    def increment():
        nonlocal count
        count += 1
        return count
    
    return increment

counter = create_counter()
print(counter())  # 1 çap edəcək
print(counter())  # 2 çap edəcək
print(counter())  # 3 çap edəcək

Bu nümunə nonlocal operatorunun çağırışlar arasında öz vəziyyətini saxlayan bir funksiya yaratmaq üçün real ssenarilərdə necə istifadə oluna biləcəyini göstərir.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION