نطاق المتغيرات variable scopes هو ما يعرف حدود الوصول الى المتغيرات او نطاقها داخل الكود، فعادة ما يتكون البرنامج من اكثر من دالة (function) و اكثر من وحدة (module). هناك نوعان من النطاقات في البايثون
- المتغيرات المحلية local variables: هي المتغيرات التي يتم تعريفها داخل الدوال و يكون نطاقها داخل الدالة المعرفة فيها
- المتغيرات العالمية global variables: هي المتغيرات التي يتم تعريفها خارج الدوال و يكون نطاقها الوحدة المعرف داخلها، اي داخل الدوال وخارجها
الوحدة هو ملف بايثون يحتوي على عدة دوال ويمكن ان نعيد استخدامها في ملف/ وحدة اخر. اغلب الامثلة التي نستخدمها يكون البرنامج عبارة عن ملف واحد اي وحدة واحدة.
المتغيرات المحلية local variables
هي المتغيرات التي يتم تعريفها داخل الدوال و يكون نطاقها داخل تلك الدالة. اي ان حدود استخدامها هو الدالة التي تعرف بداخلها
# خارج الدالة # هنا msg لا نستطيع استخدام المتغير def fun() : # msg => local variable متغير محلي msg = "I love " fruits = ["apples", "oranges", "bananas"] for fruit in fruits: # داخل الدالة for نستطيع الوصول للمتغير لان ال print(msg + fruit) # نستطيع الوصول للمتغير لاننا لازلنا داخل الدالة print(msg + "All fruits") return # خارج الدالة # هنا msg لا نستطيع استخدام المتغير def fun_2(): # خارج الدالة # هنا msg لا نستطيع استخدام المتغير
كما في المثال السابق، حدود المتغير المحلي هو داخل الدالة الذي عرف فيها واذا حاولنا استخدامه خارجها يحدث خطأ ويتوقف البرنامج عن العمل
تشغيلdef fun() : a = 10 return print(a)# Error
نستطيع تعريف متغيرات بنفس الاسم داخل دوال اخرى لكن تكون متغيرات مختلفة عنها
تشغيلdef fun_1(): a = 10 print(a) return def fun_2(): a = 5 print(a) return fun_1() # 10 fun_2() # 5
المتغيرات العالمية Global Variables
هي المتغيرات التي يتم تعريفها خارج الدوال و يكون نطاقها في كل الملف/ الوحدة ، اي داخل الدوال وخارجها.
تشغيل# global variable تعريف متغير عالمي msg = "Hello !!" def fun(): # نستطيع الوصول للمتغير داخل الدوال print(msg) return # نستطيع الوصول للمتغير خارج الدوال print(msg)
المتغيرات العالمية يكون حدودها/نطاقها هو الوحدة المعرفة داخلها. اذا حاولنا تعديل المتغيرات العالمية داخل الدوال، ما يحدث ان البايثون ينشأ متغير اخر محلي local variable بنفس الاسم وهو ما يتم تعديله واستخدامه داخل الدالة، واذا اردنا ان نغير قيمة المتغير العالمي، نغيره خارج الدوال.
تشغيل# نعرف متغير عالمي counter = 6 def print_counter(): counter = 10 # سوف يتم انشاء متغير محلي بنفس اسم المتغير العالمي print(counter) # 10 return print_counter() # 10 # المتغير العالمي لم تتأثر قيمته print(counter) # 6 # يمكننا تعديل قيمة المتغير العالمي خارج الدوال counter = 12 print(counter) #12
global
اذا اردنا ان نغير قيمة متغير عالمي global variable من داخل دالة، يجب ان نستخدم كلمة global قبل اسم المتغير، حيث اننا نقول للبايثون: “هذا متغير عالمي ولا تنشأي متغير محلي بنفس الاسم!!”
تشغيلcount = 10 def edit_count(): global count # نجعل البايثون يتعامل مع المتغير العالمي ولا ينشأ اخر محلي count = 20 return edit_count() print(count) #20
لا يفضل تعديل المتغيرات العالمية (global variables) داخل الدوال اطلاقا او استخدامها في العموم