نطاق المتغيرات 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) داخل الدوال اطلاقا او استخدامها في العموم

guest
0 تعليقات
Inline Feedbacks
اظهر كل التعليقات