أساسيات بايثون 15: شرح Scope في Python والفرق بين المتغير المحلي والعام

أساسيات بايثون 15 شرح Scope في Python والفرق بين المتغير المحلي والعام

بعد أن تعلمنا في الدروس السابقة معنى Functions وشرحنا فكرة return، نحتاج الآن إلى فهم موضوع مهم جدًا عند التعامل مع الدوال، وهو Scope في Python.

كلمة Scope تعني نطاق المتغير: أين يمكن استخدام المتغير؟ وهل يمكن الوصول إليه من داخل الدالة فقط، أم من أي مكان في البرنامج؟

في هذا الدرس من سلسلة أساسيات بايثون على موقع بايثون العرب، سنتعلم الفرق بين المتغير المحلي Local Variable و المتغير العام Global Variable، وسنرى لماذا تظهر أخطاء للمبتدئين عند استخدام المتغيرات داخل الدوال.

{getToc} $title={محتوى المقال}

{alertInfo} فهم Scope مهم جدًا بعد تعلم الدوال، لأنه يوضح لك أين يعيش المتغير ومتى يمكن استخدامه.

شرح المتغير المحلي داخل دالة Python ولماذا لا يمكن استخدامه خارج الدالة

ما معنى Scope في Python؟

الـ Scope في Python هو المكان أو النطاق الذي يمكن فيه استخدام المتغير داخل البرنامج.

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

مثال سريع:

def say_hello():
    message = "Hello"
    print(message)

say_hello()

في هذا المثال، المتغير message تم إنشاؤه داخل الدالة، لذلك يمكن استخدامه داخل الدالة فقط.

ما هو المتغير المحلي Local Variable؟

المتغير المحلي Local Variable هو متغير يتم إنشاؤه داخل دالة، ويكون متاحًا داخل هذه الدالة فقط.

مثال:

def greet():
    name = "Ahmed"
    print(name)

greet()

الناتج:

Ahmed

هنا المتغير name موجود داخل الدالة greet، لذلك يمكن طباعته داخل الدالة بشكل طبيعي.

{alertSuccess} أي متغير يتم إنشاؤه داخل الدالة يسمى Local Variable، ويكون نطاقه داخل هذه الدالة فقط.

شرح الفرق بين متغير داخل الدالة ومتغير خارج الدالة في Python

ماذا يحدث إذا استخدمنا المتغير المحلي خارج الدالة؟

إذا حاولنا استخدام متغير محلي خارج الدالة، سيظهر خطأ لأن Python لا يعرف هذا المتغير خارج نطاق الدالة.

مثال خاطئ:

def greet():
    name = "Ahmed"

greet()

print(name)

هنا سيظهر خطأ لأن name تم تعريفه داخل الدالة، وليس خارجها.

غالبًا ستظهر رسالة مثل:

NameError: name 'name' is not defined

السبب ببساطة أن المتغير المحلي لا يعيش خارج الدالة.

{alertWarning} إذا عرّفت متغيرًا داخل دالة، فلا تتوقع أن تستخدمه خارجها مباشرة.

كيف نستخدم قيمة من داخل الدالة خارجها؟

إذا أردت استخدام قيمة تم إنشاؤها داخل الدالة في مكان آخر من البرنامج، استخدم return.

def get_name():
    name = "Ahmed"
    return name

student_name = get_name()

print(student_name)

الناتج:

Ahmed

هنا لم نحاول استخدام المتغير المحلي نفسه خارج الدالة، بل جعلنا الدالة ترجع قيمته باستخدام return.

إذا لم تقرأ درس return بعد، يمكنك الرجوع إلى: أساسيات بايثون 14: شرح return في Functions.

ما هو المتغير العام Global Variable؟

المتغير العام Global Variable هو متغير يتم تعريفه خارج الدوال، ويمكن قراءته من أماكن مختلفة في البرنامج.

مثال:

site_name = "Arab Python"

def show_site():
    print(site_name)

show_site()

الناتج:

Arab Python

المتغير site_name تم تعريفه خارج الدالة، لذلك استطاعت الدالة قراءته.

شرح قراءة المتغير العام داخل الدالة في Python بدون استخدام global

هل يمكن تعديل المتغير العام داخل الدالة؟

قراءة المتغير العام من داخل الدالة سهلة، لكن تعديل قيمته يحتاج انتباهًا.

انظر لهذا المثال:

count = 0

def increase():
    count = 1
    print(count)

increase()
print(count)

الناتج:

1
0

لماذا طبع البرنامج 1 ثم 0؟

لأن count داخل الدالة أصبح متغيرًا محليًا جديدًا، ولم يغير المتغير العام الموجود خارج الدالة.

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

إذا أردت تعديل متغير عام من داخل دالة، يمكنك استخدام الكلمة global.

count = 0

def increase():
    global count
    count = count + 1

increase()

print(count)

الناتج:

1

استخدمنا global count حتى نخبر Python أننا نريد استخدام المتغير العام count نفسه، وليس إنشاء متغير محلي جديد.

{alertWarning} استخدم global بحذر. في أغلب البرامج التعليمية، الأفضل إرجاع القيمة باستخدام return بدل تعديل المتغيرات العامة مباشرة.

الأفضل: استخدام return بدل global

في كثير من الحالات، الأفضل أن تجعل الدالة ترجع قيمة جديدة بدل أن تعدل متغيرًا عامًا مباشرة.

مثال أفضل:

def increase(number):
    return number + 1

count = 0
count = increase(count)

print(count)

الناتج:

1

هنا الدالة لا تعتمد على متغير عام، بل تستقبل قيمة وترجع قيمة جديدة، وهذا يجعل الكود أوضح وأسهل في التتبع.

{alertSuccess} في مرحلة التعلم، حاول استخدام Parameters و return بدل الاعتماد الزائد على global.

الفرق بين Local و Global Variable

النوع مكان التعريف أين يمكن استخدامه؟
Local Variable داخل الدالة داخل نفس الدالة فقط
Global Variable خارج الدوال يمكن قراءته في أماكن متعددة

مثال يجمع Local و Global في نفس البرنامج

انظر إلى هذا المثال:

language = "Python"

def show_info():
    level = "Beginner"
    print(language)
    print(level)

show_info()

الناتج:

Python
Beginner

المتغير language عام لأنه خارج الدالة، والمتغير level محلي لأنه داخل الدالة.

خطأ شائع: استخدام المتغير قبل تعريفه

من الأخطاء الشائعة أن تحاول استخدام متغير داخل الدالة قبل أن يكون واضحًا لبايثون هل هو محلي أم عام.

مثال خاطئ:

count = 10

def show_count():
    print(count)
    count = 20

show_count()

قد يظهر خطأ لأن Python يرى أن count داخل الدالة سيتم تعديله، فيعتبره متغيرًا محليًا، لكنك حاولت طباعته قبل إعطائه قيمة داخل الدالة.

الحل الأفضل هو عدم تعديل المتغير العام بهذه الطريقة، واستخدام قيمة راجعة:

count = 10

def change_count(number):
    return 20

count = change_count(count)

print(count)

أخطاء شائعة في Scope عند المبتدئين

1. استخدام متغير محلي خارج الدالة

إذا عرّفت المتغير داخل الدالة، لا تستخدمه خارجها مباشرة.

2. تعديل المتغير العام بدون فهم global

إذا حاولت تعديل متغير عام داخل دالة بدون global، فقد ينشئ Python متغيرًا محليًا جديدًا بدل تعديل العام.

3. الاعتماد الزائد على global

كثرة استخدام global تجعل الكود أصعب في الفهم والتتبع. استخدمها فقط عندما تحتاجها فعلًا.

4. نسيان استخدام return

إذا أردت قيمة من داخل الدالة، غالبًا الحل الأفضل هو return.

مقارنة بين Local و Global في Python مع أشهر أخطاء Scope

تمرين بسيط

ما الناتج من الكود التالي؟

name = "Ali"

def show_name():
    name = "Omar"
    print(name)

show_name()
print(name)

الناتج:

Omar
Ali

داخل الدالة تم إنشاء متغير محلي اسمه name وقيمته Omar، أما خارج الدالة فالمتغير العام ما زال قيمته Ali.

أسئلة شائعة حول Scope في Python

ما معنى Scope في Python؟

يعني نطاق المتغير، أو المكان الذي يمكن فيه استخدام المتغير داخل البرنامج.

ما الفرق بين Local Variable و Global Variable؟

المتغير المحلي يتم تعريفه داخل الدالة ويستخدم داخلها فقط، أما المتغير العام فيتم تعريفه خارج الدوال ويمكن قراءته من أماكن متعددة.

هل يمكن استخدام متغير داخل الدالة خارجها؟

لا يمكن استخدام المتغير المحلي خارج الدالة مباشرة. إذا أردت قيمته، استخدم return.

ما فائدة global في Python؟

تستخدم global عندما تريد تعديل متغير عام من داخل دالة، لكن لا ينصح بالإكثار منها.

هل الأفضل استخدام global أم return؟

في أغلب الحالات التعليمية والبرامج الواضحة، الأفضل استخدام return لأنها تجعل الكود أسهل في الفهم.

روابط مهمة من بايثون العرب

مصدر خارجي مفيد

يمكنك قراءة توثيق Python الرسمي حول الدوال ونطاق المتغيرات من هنا: Python Documentation - Scopes and Namespaces.

خلاصة المقال

في هذا الدرس تعلمنا معنى Scope في Python، وعرفنا أن المتغيرات لا تكون متاحة دائمًا في كل مكان داخل البرنامج.

تعلمنا أن Local Variable هو متغير يتم تعريفه داخل الدالة ويستخدم داخلها فقط، بينما Global Variable يتم تعريفه خارج الدوال ويمكن قراءته من أماكن مختلفة.

كذلك عرفنا أن استخدام return غالبًا أفضل من الاعتماد الزائد على global، خاصة أثناء تعلم بايثون وكتابة برامج واضحة ومنظمة.

{alertSuccess} قاعدة بسيطة: المتغير داخل الدالة يعيش داخلها فقط، وإذا أردت قيمته خارجها فاستخدم return.

إرسال تعليق

أحدث أقدم