O'zgaruvchilar ko'lami bilan tanishish
Pythonda o'zgaruvchilarni uch xil ko'lamda (scope) e'lon qilishimiz mumkin: lokal (local) ko'lam, global (global) ko'lam va nolokal (nonlocal) ko'lam.
O'zgaruvchi ko'lami — bu o'zgaruvchiga murojaat qila oladigan hududni belgilaydi. Masalan,
def add_numbers():
sum = 5 + 4
Bu yerda, sum o'zgaruvchisi funksiya ichida yaratilgan, shuning uchun unga faqat funksiya ichida murojaat qilish mumkin (lokal ko'lam). Bunday turdagi o'zgaruvchi lokal o'zgaruvchi deb ataladi.
Ko'lamiga qarab, Python o'zgaruvchilarini uch turga ajratishimiz mumkin:
O'zgaruvchilarni funksiya ichida e'lon qilganimizda, bu o'zgaruvchilar lokal ko'lamga (funksiya ichida) ega bo'ladi. Ularga funksiyadan tashqarida murojaat qila olmaymiz.
Bunday turdagi o'zgaruvchilar lokal o'zgaruvchilar deb ataladi. Masalan,
def greet():
# lokal o'zgaruvchi
message = 'Hello'
print('Local', message)
greet()
# message o'zgaruvchisiga
# greet() funksiyasidan tashqarida murojaat qilishga urinish
print(message)
Natija
Local Hello
NameError: name 'message' is not defined
Bu yerda, message o'zgaruvchisi greet() funksiyasiga lokal, shuning uchun unga faqat funksiya ichida murojaat qilish mumkin.
Shuning uchun, unga greet() funksiyasidan tashqarida murojaat qilishga urinsak, xatolikka duch kelamiz.
Bu muammoni tuzatish uchun, message nomli o'zgaruvchini global qilishimiz mumkin.
Pythonda funksiyadan tashqarida yoki global ko'lamda e'lon qilingan o'zgaruvchi global o'zgaruvchi deb ataladi. Bu shuni anglatadiki, global o'zgaruvchiga funksiya ichida ham, tashqarisida ham murojaat qilish mumkin.
Keling, Pythonda global o'zgaruvchi qanday yaratilishiga misolni ko'ramiz.
# global o'zgaruvchini e'lon qilish
message = 'Hello'
def greet():
# lokal o'zgaruvchini e'lon qilish
print('Local', message)
greet()
print('Global', message)
Natija
Local Hello
Global Hello
Bu safar message o'zgaruvchisiga greet() funksiyasidan tashqarida ham murojaat qila olamiz. Buning sababi, biz message o'zgaruvchisini global o'zgaruvchi sifatida yaratganmiz.
# global o'zgaruvchini e'lon qilish
message = 'Hello'
Endi, message dasturning istalgan ko'lamidan (hududidan) foydalanish mumkin bo'ladi.
Pythonda nonlocal kalit so'zi ichma-ich (nested) funksiyalar ichida o'zgaruvchi ichki funksiyaga lokal emasligini, balki uni o'rab turgan funksiyaning ko'lamiga tegishli ekanligini bildirish uchun ishlatiladi.
Bu sizga tashqi o'zgaruvchini global o'zgaruvchilardan alohida saqlagan holda, ichma-ich funksiya ichida tashqi funksiyaning o'zgaruvchisini o'zgartirish imkonini beradi.
# tashqi funksiya
def outer():
message = 'local'
# ichma-ich (nested) funksiya
def inner():
# nolokal o'zgaruvchini e'lon qilish
nonlocal message
message = 'nonlocal'
print("inner:", message)
inner()
print("outer:", message)
outer()
Natija
inner: nonlocal
outer: nonlocal
Yuqoridagi misolda, ichma-ich inner() funksiyasi bor. inner() funksiyasi boshqa bir outer() funksiyasining ko'lamida e'lon qilingan.
Biz ichma-ich funksiya ichida tashqi funksiyaning message o'zgaruvchisini o'zgartirish uchun nonlocal kalit so'zidan foydalandik.
Eslatma: Agar nolokal o'zgaruvchining qiymatini o'zgartirsak, o'zgarishlar lokal o'zgaruvchida ham namoyon bo'ladi.
Ko'proq o'qing: Python Namespace and Scope