পাইথন - সীমাবদ্ধতা
একটি পরিবর্তনশীল শুধুমাত্র সেই অঞ্চল থেকে পাওয়া যায় যেখানে এটি তৈরি করা হয়েছে। একে সীমা বলে।
একটি সীমা কি?
সীমাবদ্ধতার ধারণা
সংজ্ঞা:এমন এলাকা যেখানে ভেরিয়েবল অ্যাক্সেসযোগ্য
গুরুত্ব:পরিবর্তনশীল দ্বন্দ্ব এড়িয়ে যায়
পাইথন:4 ধরনের সীমাবদ্ধতা
কেন একটি সীমা আছে?
নিরাপত্তা:ঘটনাক্রমে পরিবর্তন করা থেকে ভেরিয়েবল প্রতিরোধ করে
স্মৃতি:দক্ষ মেমরি ব্যবস্থাপনা
মডিউল:কোড আলাদা করে
স্থানীয় সীমা
একটি ফাংশনের ভিতরে তৈরি একটি ভেরিয়েবল সেই ফাংশনের স্থানীয় সুযোগের অন্তর্গত এবং শুধুমাত্র সেই ফাংশনের ভিতরে ব্যবহার করা যেতে পারে।
টিপ:
ফাংশনটি সম্পূর্ণ হলে স্থানীয় ভেরিয়েবলগুলি ধ্বংস হয়ে যায়। তারা ফাংশনের বাইরে পাওয়া যায় না।
উদাহরণ
একটি ফাংশনের ভিতরে তৈরি একটি ভেরিয়েবল সেই ফাংশনের ভিতরে উপলব্ধ:
def myfunc(): x = 300 মুদ্রণ(x) myfunc() # আউটপুট: 300 # নিম্নলিখিত লাইনটি একটি ত্রুটি সৃষ্টি করবে # মুদ্রণ(x) # নাম ত্রুটি: নাম 'x' সংজ্ঞায়িত করা হয়নি
স্মৃতি প্রতিনিধিত্ব:
যখন myfunc() বলা হয়:x একটি স্থানীয় পরিবর্তনশীল হিসাবে তৈরি করা হয়
myfunc(): ভিতরেx অ্যাক্সেসযোগ্য
myfunc() সম্পূর্ণ হওয়ার পর:x ধ্বংস হয়
কর্মের বাইরে:x অনির্ধারিত
ফাংশনের মধ্যে ফাংশন
উপরের উদাহরণে যেমন দেখানো হয়েছে, ভেরিয়েবল x ফাংশনের বাইরে পাওয়া যায় না, তবে এটি ফাংশনের ভিতরে যেকোন ফাংশনের জন্য উপলব্ধ:
উদাহরণ
একটি স্থানীয় ভেরিয়েবল একটি ফাংশনের ভিতরে একটি ফাংশন থেকে অ্যাক্সেস করা যেতে পারে:
def myfunc(): x = 300 def myinnerfunc(): প্রিন্ট(x) # এক্সেস ফাংশন x ভিতরে myinnerfunc() myfunc() # আউটপুট: 300
কার্যকরী মাত্রা
লেভেল 1:myfunc() বলা হয়
লেভেল 2:x = 300 উৎপন্ন হয়
লেভেল 3:myinnerfunc() বলা হয়
স্তর 4:myinnerfunc() এক্স অ্যাক্সেস করে
লেভেল 5:x ধ্বংস হয়
অ্যাক্সেসের নিয়ম
ভিতরের ফাংশন:বাইরের একটি ফাংশনের ভেরিয়েবল দেখা যায়
বাইরের কার্যকলাপ:ভিতরে ফাংশন ভেরিয়েবল দেখতে পাচ্ছি না
একটি দৃষ্টি:ভিতরে থেকে আপনি বাইরে দেখতে পারেন, কিন্তু বাইরে থেকে আপনি ভিতরে দেখতে পাবেন না
বিস্তৃত পরিসর
পাইথন কোডের মূল অংশে তৈরি একটি ভেরিয়েবল একটি বিশ্বব্যাপী পরিবর্তনশীল এবং এটি একটি বিশ্বব্যাপী পরিসরের অন্তর্গত।
দ্রষ্টব্য:
গ্লোবাল ভেরিয়েবল যে কোনো পরিসর থেকে অ্যাক্সেস করা যেতে পারে, গ্লোবাল এবং স্থানীয় উভয়।
উদাহরণ
একটি ফাংশনের বাইরে তৈরি একটি ভেরিয়েবল সর্বজনীন এবং যে কেউ ব্যবহার করতে পারে:
x = 300 # ভর পরিবর্তনশীল def myfunc(): print(x) # ফাংশন অ্যারে ভেরিয়েবল অ্যাক্সেস করে myfunc() # আউটপুট: 300 মুদ্রণ(x) # আউটপুট: 300 (ফাংশনের বাইরে অ্যাক্সেসযোগ্য)
ভেরিয়েবলের নামকরণ
আপনি যদি একই ভেরিয়েবল নামের একটি ফাংশনের ভিতরে এবং বাইরে একটি ফাংশন পাস করেন, পাইথন তাদের দুটি পৃথক ভেরিয়েবল হিসাবে বিবেচনা করে, একটি গ্লোবাল স্কোপে (ফাংশনের বাইরে) এবং একটি স্থানীয় সুযোগে (ফাংশনের ভিতরে):
উদাহরণ
ফাংশনটি স্থানীয় x মুদ্রণ করবে, তারপর কোডটি বিশ্বব্যাপী x মুদ্রণ করবে:
x = 300 # এলাকা x def myfunc(): x = 200 # স্থানীয় x (গ্লোবাল x থেকে ভিন্ন) print("Inside function:", x) # স্থানীয় x প্রিন্ট করে myfunc() # আউটপুট: ভিতরে ফাংশন: 200 প্রিন্ট ("বাইরের ফাংশন:", x) # আউটপুট: বাইরের ফাংশন: 300
মূল পার্থক্য:
ফাংশনের মধ্যেx = 200একটি নতুন স্থানীয় ভেরিয়েবল তৈরি করে যা গ্লোবাল ভেরিয়েবল x কে প্রতিস্থাপন করে না। একে বলা হয় ‘লুকিয়ে রাখা’।
globalকীওয়ার্ড
আপনি যদি একটি গ্লোবাল ভেরিয়েবল তৈরি করতে চান কিন্তু স্থানীয় সুযোগে আটকে থাকেন,globalকীওয়ার্ড ব্যবহার করা যেতে পারে।
টিপ:
globalকীওয়ার্ডটি ভেরিয়েবলটিকে সুযোগ পরিসরের অন্তর্গত করে তোলে।
উদাহরণ 1: একটি পাবলিক ভেরিয়েবল তৈরি করা
def myfunc(): global x # ঘোষণা করুন যে x একটি গ্লোবাল ভেরিয়েবল x = 300 myfunc() মুদ্রণ(x) # আউটপুট: 300 (ফাংশনের বাইরে উপলব্ধ)
উদাহরণ 2: একটি ভর পরিবর্তনশীল প্রতিস্থাপন
x = 300 # ভর পরিবর্তনশীল def myfunc(): global x # x পরিবর্তনের জন্য বিশ্বব্যাপী ঘোষণা করে x = 200 # ভর x রূপান্তরিত করে myfunc() মুদ্রণ(x) # আউটপুট: 200 (স্প্রেড ভেরিয়েবল পরিবর্তিত)
nonlocalকীওয়ার্ড
nonlocalকীওয়ার্ডটি নেস্টেড ফাংশনের মধ্যে ভেরিয়েবলের সাথে কাজ করতে ব্যবহৃত হয়।
দ্রষ্টব্য:
nonlocalকীওয়ার্ডটি ভেরিয়েবলটিকে বাইরের ফাংশনের অন্তর্গত করে তোলে।
উদাহরণ
def myfunc1(): x = "জেন" # বাইরের ফাংশন ভেরিয়েবল def myfunc2(): nonlocal x # ফাংশনের বাইরে x পরিবর্তন করার ঘোষণা করুন x = "হ্যালো" # বাইরের ফাংশনে x প্রতিস্থাপন করে myfunc2() রিটার্ন এক্স print(myfunc1()) # আউটপুট: "হ্যালো"
global vs nonlocal
global:ভর ভেরিয়েবল জন্য
nonlocal:অন্তর্ভুক্ত ফাংশন ভেরিয়েবলের জন্য
লক্ষ্য:বিশ্বব্যাপী → মডিউল স্তর
লক্ষ্য:অ-স্থানীয় → অন্তর্নিহিত ফাংশন
অনুক্রম
লেভেল 1:বিস্তৃত পরিসর
লেভেল 2:অন্তর্ভুক্ত পরিসীমা
লেভেল 3:স্থানীয় সীমা
nonlocal:লেভেল 3 থেকে লেভেল 2 এ
LEGB নিয়ম
ভেরিয়েবলের নাম অনুসন্ধান করার সময় পাইথন LEGB নিয়ম অনুসরণ করে এবং এই ক্রমে সেগুলি অনুসন্ধান করে:
| ক্রম | সীমা | ব্যাখ্যা | উদাহরণ |
|---|---|---|---|
| 1 | Local | বর্তমান ফাংশনের মধ্যে | def func(): x = 10 |
| 2 | Enclosing | (ভিতর থেকে বাইরে) | def outer(): x = 10; def inner(): |
| 3 | Global | ব্লকের শীর্ষে | x = 10 # ব্লক অবস্থান |
| 4 | Built-in | পাইথনের অন্তর্নির্মিত নামস্থানে | print, len, str |
উদাহরণ: LEGB নিয়ম বোঝা
x = "গ্লোবাল" # বিশ্বস্তর def outer(): x = "ঘেরা" # ঘেরা অবস্থান def inner(): x = "স্থানীয়" # স্থানীয় স্তর print("Inner:", x) # স্থানীয় x ব্যবহার করে ভিতরের() print("Outer:", x) # থাকা x ব্যবহার করে বাইরের() প্রিন্ট ("গ্লোবাল:", x) # গ্লোবাল এক্স ব্যবহার করুন
LEGB অনুসন্ধান প্রক্রিয়া:
ভিতরের() ফাংশনে:
- স্থানীয়:
x = "local"→ উপলব্ধ → ব্যবহার করা
বাইরের() ফাংশনে:
- স্থানীয়: না x
- অন্তর্ভুক্ত:
x = "enclosing"→ উপলব্ধ → ব্যবহার করা
ব্যাচ মোডে:
- স্থানীয়: না x
- অন্তর্ভুক্ত: কোন x
- ব্যাপক:
x = "global"→ উপলব্ধ → ব্যবহার করা
পরিসীমা ভিজ্যুয়ালাইজেশন
কার্যকরী মাত্রা
# বিস্তৃত পরিসর global_var = "আমি বিশ্বব্যাপী" def outer(): # অন্তর্ভুক্ত পরিসর enclosing_var = "আমি ঘেরাও করছি" def inner(): # স্থানীয় সীমা local_var = "আমি স্থানীয়" মুদ্রণ(স্থানীয়_ভার) মুদ্রণ (ঘেরা_ভার) মুদ্রণ(গ্লোবাল_ভার) ভিতরের() # মুদ্রণ(স্থানীয়_ভার) # ত্রুটি! বাইরের() # মুদ্রণ (ঘেরা_ভার) # ত্রুটি!
পরিসীমা ভিজ্যুয়ালাইজেশন
global_var = "I'm global"
enclosing_var = "I'm enclosing"
local_var = "I'm local"
← ভিতর থেকে দেখা যায় →
← বাইরে থেকে ভিতরে দেখা যায় না →
অনুশীলন করুন
নিম্নলিখিত কোড বিবেচনা করুন:
x = 300
def myfunc():
x = 200
myfunc()
print(x)
মুদ্রিত ফলাফল কি হবে?
অনুশীলন প্রশ্ন:
সর্বোত্তম অনুশীলন
globalএবংnonlocalসতর্কতার সাথে ব্যবহার করুন:তারা বিভ্রান্তিকর হতে পারে