পাইথনে ননলোকাল নির্দেশিকা

কিছু ক্ষেত্রে থাকে যখন বাইরের ফাংশনে একটি ভেরিয়েবল থাকে, যার অ্যাক্সেস অভ্যন্তরীণ ফাংশনে পাওয়া দরকার। ফাংশন outer-এ i ভেরিয়েবল ডিক্লেয়ার করি। অভ্যন্তরীণ ফাংশনের সাপেক্ষে এই ভেরিয়েবলটি বহিঃস্থ (গ্লোবাল ভেরিয়েবল শুধুমাত্র বাহ্যিক কোডে ডিক্লেয়ার করা ভেরিয়েবলই হয়)। আর inner ফাংশনে i-এ এক যোগ করার কাজটি নির্ধারণ করি:

pythondef outer():
  i = 0

  def inner():
    i += 1  # আউটপুট দেবে [4, 9, 25]

  inner()

  return i

যাইহোক, inner-এর জন্য i ভেরিয়েবলটি লোকাল, পাইথন এটিকে অঘোষিত মনে করে এবং সেই অনুযায়ী ত্রুটি দেখায়। আগে এই ধরনের ত্রুটি global নির্দেশিকা ব্যবহার করে সংশোধন করা হত। যাইহোক এখানে i একটি বহিঃস্থ ভেরিয়েবল, তাই nonlocal নির্দেশিকা ব্যবহার করা উচিত। এটি গ্লোবাল স্কোপ বাদ দিয়ে, নিকটতম স্কোপ থেকে ভেরিয়েবলের তালিকাভুক্ত নামগুলো নেয়, অর্থাৎ i inner-এর ভিতরে উপরের ফাংশনে ডিক্লেয়ার করা ভেরিয়েবল থেকে নেওয়া হবে:

pythondef outer():
  i = 0

  def inner():
    nonlocal i
    i += 1

  inner()

  return i

print(outer()) # আউটপুট দেবে 1
Задание 1

নিচের কোডে একজন প্রোগ্রামার একটি ভুল করেছেন:

pythonnum = 10
def outer():
  num = 5

  def inner():
    num -= 2

  inner()

  return num
  
print(outer())

এই কোডটিতে কী সমস্যা? খুঁজে বের করুন এবং সংশোধন করুন কোড লেখকের ভুল।

Задание 2

নিচের কোডে একজন প্রোগ্রামার একটি ভুল করেছেন:

pythonnum = 3
def outer():
  num += 1
  tst = num

  def inner():
    tst = tst ** 3

  inner()

  return tst
  
print(outer())

এই কোডটিতে কী সমস্যা? খুঁজে বের করুন এবং সংশোধন করুন কোড লেখকের ভুল।