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.
GO TO FULL VERSION