المتغيرات المحلية والعالمية في بايثون: دليل الاستخدام الصحيح

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هو المتغير في بايثون

المتغير هو اسم يشير إلى كائن في ذاكرة الحاسوب. في بايثون، المتغيرات ليس لها أنواع ثابتة. النوع ينتمي إلى الكائن الذي يشير إليه المتغير.

x = 42
x = "الآن نص"

المتغيرات المحلية في بايثون

تعريف المتغيرات المحلية

يتم تعريف المتغير المحلي داخل دالة ويكون متاحًا فقط داخل هذه الدالة. بعد انتهاء تنفيذ الدالة، يتم حذف المتغير المحلي من الذاكرة.

def say_hello():
    name = "Python"  # متغير محلي
    print("مرحبًا،", name)

say_hello()
# print(name)  # خطأ: name غير معرف

المتغير name موجود فقط داخل الدالة say_hello ولا يمكن الوصول إليه خارجها.

مزايا المتغيرات المحلية

توفر المتغيرات المحلية عزلًا للبيانات وتمنع التغييرات غير المرغوب فيها من أجزاء أخرى من البرنامج. كما أنها تحرر الذاكرة تلقائيًا بعد انتهاء الدالة.

المتغيرات العالمية في بايثون

ما هي المتغيرات العالمية

يتم تعريف المتغير العالمي خارج جميع الدوال ويكون متاحًا في أي مكان في ملف البرنامج. تحتفظ هذه المتغيرات بقيمها طوال مدة تنفيذ البرنامج.

language = "Python"  # متغير عالمي

def show():
    print("اللغة:", language)

show()  # اللغة: Python

مشاكل تغيير المتغيرات العالمية

عند محاولة تغيير متغير عالمي داخل دالة، يحدث خطأ:

counter = 0

def increment():
    counter += 1  # UnboundLocalError!

يفسر بايثون counter كمتغير محلي بسبب عملية الإسناد، لكنه لم يُعرف محليًا.

الكلمة المفتاحية global

استخدام global لتغيير المتغيرات العالمية

تسمح الكلمة المفتاحية global بتغيير المتغيرات العالمية داخل الدوال:

count = 0

def increment():
    global count
    count += 1

increment()
print(count)  # 1

تطبيق global في العمليات الحسابية

total = 0

def add(x):
    global total
    total += x

add(10)
add(20)
print(total)  # 30

متى تستخدم global

يجب استخدام الكلمة المفتاحية global بحذر، لأنها قد تزيد من صعوبة تصحيح البرنامج وتجعل الكود أقل قابلية للقراءة.

نطاق المتغيرات: قاعدة LEGB

مبدأ البحث عن المتغيرات

يبحث بايثون عن المتغيرات وفقًا لقاعدة LEGB بالترتيب التالي:

  • L (Local) — داخل الدالة الحالية
  • E (Enclosing) — في الدوال المتداخلة
  • G (Global) — على مستوى الوحدة النمطية
  • B (Built-in) — الأسماء المضمنة في بايثون

مثال على عمل قاعدة LEGB

x = "global"

def outer():
    x = "enclosing"
    
    def inner():
        x = "local"
        print(x)
    
    inner()

outer()  # local

يجد بايثون المتغير x في النطاق المحلي ويستخدم قيمته.

الكلمة المفتاحية nonlocal

الوصول إلى متغيرات الدوال المتداخلة

تُستخدم الكلمة المفتاحية nonlocal للتعامل مع المتغيرات من النطاق الخارجي ولكن غير العالمي:

def outer():
    count = 0
    
    def inner():
        nonlocal count
        count += 1
        return count
    
    return inner

f = outer()
print(f())  # 1
print(f())  # 2

الفرق بين global و nonlocal

تعمل الكلمة المفتاحية global مع متغيرات مستوى الوحدة النمطية، بينما تعمل nonlocal مع المتغيرات من الدوال الخارجية ضمن نفس النطاق.

المدونات

توصيات الكتب