Pyhtonning global va lokal o`zgaruvchilari uchun qoidalar qanday?
Pythonda faqatgina funksiyaning ichidangina murojaat qilinadigan o`zgaruvchilar global o`zgaruvchi hisoblanadi. Agar o`zgaruvchiga yangi qiymat funksiya tanasining ichida o`zlashtiriladigan bo`lsa, u lokal o`zgaruvchi bo`ladi va sizga kerak bo`lsa, undan global o`zgaruvchi sifatida foydalanish uchun siz bunday imkoniyatni alohida ko`rsatib o`tishingiz kerak bo`ladi.
Bu bir qarashda murakkab bo`lib tuyulsada, lekin bu holatni tushuntirib beraylik: Bir tomondan, o`zlashtirilayotgan o`zgaruvchilar uchun global talabi bar da yuzaga kelishi mumkinbo`lgan kutilmagan holatlarning oldini olish uchun muhimdir. Boshqa tomondan esa, agar global so`zi har qanday global o`zgaruvchilar uchun majburiy bo`lganida, siz bu so`zdan har doim foydalanishga majbur bo`lar edingiz. Bu holda siz har bir tarkibiy funksiya yoki import qilinayotgan komponentni ham global sifatida doim e`lon qilishga majbur bo`lar edingiz.
Nega takrorlanish siklida turli qiymatlar bilan aniqlangan lambda funksiyalar bir xil qiymat qaytaryapti?
Masalan, siz quyidagicha kod yozdingiz deb faraz qilaylik:
>>> squares = []
>>> for x in range(5):
... squares.append(lambda: x**2)
Bu bizga x ** 2 ni hisoblovchi 5 ta funksiyadan iborat ro`yxatni beradi. Ularga murojaat qilganimizda, ular bizga mos ravishda 0, 1, 4, 6 va 9 larni qaytarishini taxmin qilishimiz mumkin. Lekin, amalda esa ularning barchasi 16 ni qaytarayotganligini ko`ramiz:
>>> squares[2]()
16
>>> squares[4]()
16
Bunday holatning sababi shundaki, x lambda uchun local emas va tashqi ko`rinish sohasida ham aniqlangandir. Buning natijasida u aniqlanganida emas, chaqirilganida hosil bo`ladi.
Takrorlashlar yakunida x = 4 bo`ladi, shuning uchun ham barcha holatlar uchun 4 ** 2 ning natijalari 16 ga teng bo`lib qoladi. Bunga ishonch hosil qilish uchun x ning qiymatini o`zgartirib, natijani tekshirish kifoya:
>>> x = 8
>>> squares[2]()
64
>>> squares = []
>>> for x in range(5):
... squares.append(lambda n=x: n**2)
Bu holatning oldini olish uchun, o`zgaruvchilarning qiymatlarini lokal holatda saqlab turish kerak.
Bu yerda n=x funksiya uchun lokal bo`lgan n o`zgaruvchini yaratadi hamda funksiyaning aniqlanish jarayonidayoq hisoblanadi:
>>> squares[2]()
4
>>> squares[4]()
16
Bunday holat nafaqat anonim, balki oddiy funksiyalar uchun ham o`rinlidir.
Dostları ilə paylaş: |