نطاق المُتغيِّر

6.3 نطاق المُتغيِّر

أهداف التعلم

في نهاية هذا القسم، ينبغي أن تكون قادرًا على:

  • تحديد نطاق متغيرات البرنامج.
  • مناقشة تأثير نطاق المُتغيِّر.

نطاق عام

نطاق (scope) المُتغيِّر هو الجزء من البرنامج الذي يمكن الوصول إلى المُتغيِّر فيه. المُتغيِّر الذي يُنشأ خارج دالّة له نطاق عام (global scope) ويمكن الوصول إليه في أي مكان في البرنامج. يبدأ برنامج بايثون في النطاق العام، ويستمر النطاق العام طوال فترة تنفيذ البرنامج.

نقطة تحقق

المُتغيِّرات العامة في برنامج يحتوي على دالّة

مفاهيم تطبيقية

المُتغيِّرات العامة

1.
أي المُتغيِّرات عامة؟
num = float(input())
num_sq = num * num
print(num, "squared is", num_sq)
  1. num فقط
  2. num_sq فقط
  3. num و num_sq
2.
أي المُتغيِّرات لها نطاق عام؟
def print_square():
  num_sq = num * num
  print(num, "squared is", num_sq)

num = float(input())
print_square()
  1. num فقط
  2. num_sq فقط
  3. num و num_sq
3.
أي الدوال يمكنها الوصول إلى num؟
def print_double():
  num_d = num * 2
  print(num, "doubled is", num_d)

def print_square():
  num_sq = num * num
  print(num, "squared is", num_sq)

num = float(input())
print_double()
print_square()
  1. print_double()
  2. print_square()
  3. print_double() و print_square()

نطاق محلي

المُتغيِّر الذي يتم إنشاؤه داخل دالّة له نطاق محلي (local scope) ولا يوجد إلا داخل الدالّة. لا يمكن الوصول إلى مُتغيِّر محلي خارج الدالّة التي تم إنشاء المُتغيِّر فيها. بعد انتهاء الدالّة من التنفيذ، لم تعد المُتغيِّرات المحلية للدالّة موجودة.

نقطة تحقق

المُتغيِّرات العامة والمحلية في برنامج يحتوي على دالّة

مفاهيم تطبيقية

المُتغيِّرات المحلية

4.
أي المُتغيِّرات محلية؟
def print_time():
  out_str = "Time is " + str(hour) + ":" + str(min)
  print(out_str)

hour = int(input())
min = int(input())
print_time()
  1. hour و min
  2. out_str
  3. hour و min و out_str
5.
أي المُتغيِّرات محلية؟
def print_greeting():
  print(out_str)

hour = int(input())
min = int(input())
if hour < 12:
  out_str = "Good morning"
else:
  out_str = "Good day"
print_greeting()
  1. hour و min
  2. out_str
  3. لا شيء
6.
أي الدوال تصل مباشرة إلى out_str؟
def print_greeting():
  print("Good day,")
  print_time()

def print_time():
  out_str = "Time is " + str(hour) + ":" + str(min)
  print(out_str)

hour = int(input())
min = int(input())
print_greeting()
  1. print_greeting()
  2. print_time()
  3. print_greeting() و print_time()

استخدام المُتغيِّرات المحلية والعامة معًا

تسمح بايثون بأن يكون للمُتغيِّرات العامة والمحلية نفس الاسم، مما قد يؤدي إلى سلوك غير متوقع للبرنامج. تتعامل الدالّة مع المُتغيِّر الذي يتم تعديله داخلها على أنه مُتغيِّر محلي ما لم يُذكر خلاف ذلك. لتعديل مُتغيِّر عام داخل دالّة، يجب الإعلان عن المُتغيِّر باستخدام الكلمة المحجوزة global.

نقطة تحقق

تعديل المُتغيِّرات العامة في برنامج يحتوي على دالّة

مفاهيم تطبيقية

استخدام كل من المُتغيِّرات المحلية والعامة

تأمل التغييرات التالية على البرنامج المثال مع الإدخال 9.

7.
ما الناتج؟
def update_hour():
  tmp = hour
  if is_dst:
    tmp += 1
  else:
    tmp -= 1

is_dst = True
hour = int(input("Enter hour: "))
update_hour()
print("New hour:", hour)
  1. New hour: 9
  2. New hour: 10
  3. Error
8.
ما الناتج؟
def update_hour():
  new_hour = hour
  if is_dst:
    new_hour += 1
  else:
    new_hour -= 1

is_dst = True
hour = int(input("Enter hour: "))
update_hour()
print("New hour:", new_hour)
  1. New hour: 9
  2. New hour: 10
  3. Error
9.
ما الناتج؟
def update_hour():
  global new_hour
  new_hour = hour
  if is_dst:
    new_hour += 1
  else:
    new_hour -= 1

is_dst = True
hour = int(input("Enter hour: "))
update_hour()
print("New hour:", new_hour)
  1. New hour: 9
  2. New hour: 10
  3. Error

فوائد تحديد النطاق

قد يتساءل المبرمج: "لماذا لا نجعل جميع المُتغيِّرات عامة لتجنب أخطاء الوصول؟" جعل كل مُتغيِّر عامًا يمكن أن يجعل البرنامج فوضويًا. مثال: يكتشف مبرمج يقوم بتصحيح أخطاء برنامج كبير أن مُتغيِّرًا ما يحمل قيمة خاطئة. إذا كان البرنامج بأكمله يمكنه تعديل المُتغيِّر، فإن الخطأ قد يكون في أي مكان في البرنامج الكبير. إن تحديد نطاق المُتغيِّر ليقتصر على ما هو ضروري فقط وتقييد استخدام المُتغيِّرات العامة يجعل البرنامج أسهل في تصحيح الأخطاء وصيانته وتحديثه.

جرّب بنفسك

إطلاق لعبة باتل رويال

اكتب برنامجًا يقرأ وضع اللعبة المحدد ويستدعي إحدى دالتين لإطلاق اللعبة. إذا كان الإدخال "br"، استدعِ الدالّة battle_royale(). وإلا، استدعِ الدالّة practice().

الدالّة battle_royale():

  • تقرأ عدد اللاعبين.
  • تحسب عدد زملاء الفريق المطلوبين. يتكون الفريق الكامل من 3 لاعبين.
  • تستدعي الدالّة find_teammates() بالعدد المحسوب.
  • تطبع "Match starting . . .".

الدالّة practice():

  • تقرأ سلسلة نصية تمثل الخريطة المطلوبة.
  • تطبع "Launching practice on [desired map]".

ملاحظة: الدالّة find_teammates() مُقدَّمة ولا تحتاج إلى تعديل.

الإدخال المعطى:

    br
    1

الإخراج هو:

    Finding 2 players...
    Match starting...

الإدخال المعطى:

    p
    Queen's Canyon

الإخراج هو:

    Launching practice on Queen's Canyon