ما هو المتغير في بايثون
المتغير هو اسم يشير إلى كائن في ذاكرة الحاسوب. في بايثون، المتغيرات ليس لها أنواع ثابتة. النوع ينتمي إلى الكائن الذي يشير إليه المتغير.
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 مع المتغيرات من الدوال الخارجية ضمن نفس النطاق.