6.3 نطاق المُتغيِّر
أهداف التعلم
في نهاية هذا القسم، ينبغي أن تكون قادرًا على:
- تحديد نطاق متغيرات البرنامج.
- مناقشة تأثير نطاق المُتغيِّر.
نطاق عام
نطاق (scope) المُتغيِّر هو الجزء من البرنامج الذي يمكن الوصول إلى المُتغيِّر فيه. المُتغيِّر الذي يُنشأ خارج دالّة له نطاق عام (global scope) ويمكن الوصول إليه في أي مكان في البرنامج. يبدأ برنامج بايثون في النطاق العام، ويستمر النطاق العام طوال فترة تنفيذ البرنامج.
مفاهيم تطبيقية
المُتغيِّرات العامة
نطاق محلي
المُتغيِّر الذي يتم إنشاؤه داخل دالّة له نطاق محلي (local scope) ولا يوجد إلا داخل الدالّة. لا يمكن الوصول إلى مُتغيِّر محلي خارج الدالّة التي تم إنشاء المُتغيِّر فيها. بعد انتهاء الدالّة من التنفيذ، لم تعد المُتغيِّرات المحلية للدالّة موجودة.
مفاهيم تطبيقية
المُتغيِّرات المحلية
استخدام المُتغيِّرات المحلية والعامة معًا
تسمح بايثون بأن يكون للمُتغيِّرات العامة والمحلية نفس الاسم، مما قد يؤدي إلى سلوك غير متوقع للبرنامج. تتعامل الدالّة مع المُتغيِّر الذي يتم تعديله داخلها على أنه مُتغيِّر محلي ما لم يُذكر خلاف ذلك. لتعديل مُتغيِّر عام داخل دالّة، يجب الإعلان عن المُتغيِّر باستخدام الكلمة المحجوزة global.
مفاهيم تطبيقية
استخدام كل من المُتغيِّرات المحلية والعامة
تأمل التغييرات التالية على البرنامج المثال مع الإدخال 9.
فوائد تحديد النطاق
قد يتساءل المبرمج: "لماذا لا نجعل جميع المُتغيِّرات عامة لتجنب أخطاء الوصول؟" جعل كل مُتغيِّر عامًا يمكن أن يجعل البرنامج فوضويًا. مثال: يكتشف مبرمج يقوم بتصحيح أخطاء برنامج كبير أن مُتغيِّرًا ما يحمل قيمة خاطئة. إذا كان البرنامج بأكمله يمكنه تعديل المُتغيِّر، فإن الخطأ قد يكون في أي مكان في البرنامج الكبير. إن تحديد نطاق المُتغيِّر ليقتصر على ما هو ضروري فقط وتقييد استخدام المُتغيِّرات العامة يجعل البرنامج أسهل في تصحيح الأخطاء وصيانته وتحديثه.
جرّب بنفسك
إطلاق لعبة باتل رويال
اكتب برنامجًا يقرأ وضع اللعبة المحدد ويستدعي إحدى دالتين لإطلاق اللعبة. إذا كان الإدخال "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