মূল content-এ যাও

Python for AI/Functions, Modules ও Packages/Lesson 18

Scope

কোন variable কোথা থেকে দেখা যায় — local, global, LEGB নিয়ম, global keyword কেন এড়িয়ে চলবে, আর closure দিয়ে মনে রাখা function।

সময়
20 মিনিট
Exercise
1
Challenge
1
Quiz
3 প্রশ্ন

সহজ ভাষায়

Scope মানে একটা variable কোথা থেকে "দেখা যায়"।

একটা বাড়ি কল্পনা করো। প্রতিটা ঘরের (function) ভেতরের জিনিস শুধু সেই ঘরেই ব্যবহার হয়। কিন্তু উঠানের (global) জিনিস সব ঘর থেকে দেখা যায়।

main.py

greet() function city দেখতে পায় (উঠানের জিনিস), কিন্তু বাইরে থেকে name দেখা যায় না:

main.py

কেন দরকার?

  • বড় project-এ হাজার হাজার variable থাকে। Scope না থাকলে এক function-এর i আরেক function-এর i-কে নষ্ট করে দিত।
  • ML code-এ সবচেয়ে কঠিন bug-গুলোর একটা: Jupyter notebook-এ global variable এদিক-ওদিক বদলে যাওয়া, আর বুঝতে না পারা কোন মান কোথা থেকে এল।
  • Scope বুঝলে বোঝা যায় কেন ভালো function input নেয় আর output return করে — বাইরের জিনিস চুপচাপ বদলায় না।

Local আর Global

main.py

ভেতরে total = 10 লিখলে বাইরেরটা বদলায় না — নতুন একটা local total তৈরি হয়।

এখন সমস্যাটা দেখো:

main.py

UnboundLocalError! Python function-টা পড়েই দেখে ভেতরে count = ... আছে, তাই পুরো function-এ count হলো local। কিন্তু ডান পাশে count + 1 পড়ার সময় local count এখনো তৈরিই হয়নি।

global keyword — এবং কেন এড়িয়ে চলবে

main.py

কাজ করে, কিন্তু এটা খারাপ অভ্যাস। কেন? Function-টা এখন বাইরের জিনিস চুপচাপ বদলায় — function-এর নাম আর argument দেখে বোঝার উপায় নেই। Test করা কঠিন, bug খোঁজা কঠিন।

ভালো উপায় — মান পাঠাও, ফলাফল return করো:

main.py

এখন function-টা একটা pure function — একই input দিলে সবসময় একই output, বাইরের কিছু বদলায় না।

LEGB নিয়ম

একটা নাম দেখলে Python এই ক্রমে খোঁজে:

L  Local      -> এই function-এর ভেতরে
E  Enclosing  -> বাইরের function-এর ভেতরে (function-এর ভেতরে function হলে)
G  Global     -> এই file/module-এর একদম বাইরে
B  Built-in   -> Python-এর নিজের নাম: print, len, sum, list ...

প্রথম যেখানে পায়, সেটাই নেয়। এজন্যই built-in নামে variable বানালে সমস্যা:

main.py

তুমি Global-এ list বানিয়েছো, তাই Python আর Built-in list() পর্যন্ত পৌঁছায় না।

Closure: মনে রাখা function

Function-এর ভেতরে function বানালে, ভেতরের function বাইরের function-এর variable মনে রাখে — এমনকি বাইরের function শেষ হয়ে যাওয়ার পরেও:

main.py

double মনে রেখেছে n = 2, triple মনে রেখেছে n = 3। একে বলে closure।

ভেতর থেকে বাইরের function-এর variable বদলাতে চাইলে nonlocal লাগে — challenge-এ এটা কাজে লাগবে।

Exercise

Exercise

Bug ঠিক করো

+20 XP

নিচের code-এ UnboundLocalError আসছে। global keyword ব্যবহার না করে ঠিক করো: add_visit function-কে বর্তমান count নিতে আর নতুন count return করতে দাও, এবং বাইরে ফলাফলটা আবার visits-এ রাখো।

শেষে visits-এর মান হবে 3।

solution.py

Quiz

  1. Q1নিচের code-এর output কী?
    x = 10
    
    def show():
        x = 99
        print(x)
    
    show()
    print(x)
    
  2. Q2LEGB নিয়মে Python কোন ক্রমে variable খোঁজে?
  3. Q3কোন variable নাম দিলে built-in function নষ্ট হয়ে যায়?
0/3 answered

Challenge

Challenge

Closure দিয়ে counter

+50 XP

make_counter(start=0) function লেখো যেটা একটা নতুন function return করে। Return করা function-টা প্রতিবার ডাকলে count ১ বাড়ায় এবং নতুন মান return করে।

প্রতিটা counter-এর নিজের আলাদা count থাকবে। Global variable ব্যবহার করা যাবে না।

solution.py

বাস্তবে কোথায় ব্যবহার হয়?

Learning rate scheduler — training-এ learning rate ধীরে ধীরে কমানো হয়। Closure দিয়ে একটা scheduler বানানো যায় যেটা নিজের setting মনে রাখে:

main.py

PyTorch-এর torch.optim.lr_scheduler.LambdaLR ঠিক এরকম একটা function নেয়। আর পরে decorator শিখবে — সেগুলোও closure দিয়েই তৈরি।

Interview প্রশ্ন

  • Beginner: Local আর global variable-এর পার্থক্য কী?
  • Intermediate: UnboundLocalError কেন হয়? উদাহরণ দিয়ে ব্যাখ্যা করো।
  • Advanced: Closure কী? nonlocal আর global-এর পার্থক্য কী?

এরপর কী?

এতক্ষণ সব code এক জায়গায় লিখেছি। কিন্তু Python-এর আসল শক্তি হলো অন্যের লেখা code ব্যবহার করা — math, random, statistics... পরের lesson: Modules ও import।