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

نشرت: 2021-08-26

تتعامل بايثون مع المتغيرات بطريقة مستقلة للغاية. في حين أن العديد من لغات البرمجة تعتبر المتغيرات عامة بشكل افتراضي (ما لم يتم الإعلان عنها على أنها محلية) ، فإن Python تعتبر المتغيرات على أنها محلية ما لم يتم التصريح بالعكس. السبب الدافع وراء اعتبار بايثون للمتغيرات على أنها محلية بشكل افتراضي هو أن استخدام المتغيرات العالمية يُنظر إليه عمومًا على أنه ممارسة سيئة في الترميز.

لذلك ، أثناء البرمجة في Python ، عندما يحدث تعريف متغير داخل دالة ، فإنها تكون محلية بشكل افتراضي. أي تعديلات أو تلاعبات تجريها على هذا المتغير داخل جسم الوظيفة ستبقى فقط في نطاق هذه الوظيفة. أو بعبارة أخرى ، لن تنعكس هذه التغييرات في أي متغير آخر خارج الوظيفة ، حتى لو كان للمتغير نفس اسم متغير الوظيفة. توجد جميع المتغيرات في نطاق الوظيفة التي تم تعريفها فيها وتحتفظ بهذه القيمة. للحصول على خبرة عملية في متغيرات ومشاريع Python ، جرب شهادات علوم البيانات لدينا من أفضل الجامعات في الولايات المتحدة.

من خلال هذه المقالة ، دعنا نستكشف مفهوم المتغيرات المحلية والعالمية في بايثون ، جنبًا إلى جنب مع كيفية تحديد المتغيرات العالمية. سننظر أيضًا في شيء يُعرف باسم "المتغيرات غير المحلية".

واصل القراءة!

جدول المحتويات

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

لنلقِ نظرة على مثال لفهم كيفية استخدام القيم العامة داخل جسم الوظيفة في Python:

برنامج:

def func ():

طباعة (سلسلة)

string = "أحب بايثون!"

func ()

انتاج |

أنا أحب بايثون!

كما ترى ، يتم إعطاء سلسلة المتغير القيمة "أنا أحب Python!" قبل استدعاء func (). يتكون جسم الوظيفة من عبارة print فقط. نظرًا لعدم وجود تخصيص لمتغير السلسلة داخل جسم الوظيفة ، فسيأخذ قيمة المتغير العام بدلاً من ذلك.

نتيجة لذلك ، سيكون الناتج مهما كانت القيمة العامة للسلسلة المتغيرة ، والتي في هذه الحالة ، "أنا أحب Python!".

الآن ، دعونا نغير قيمة السلسلة داخل func () ونرى كيف تؤثر على المتغيرات العامة:

برنامج:

def func ():

سلسلة = "أحب جافا!"

طباعة (سلسلة)

string = "أحب بايثون!"

func ()

طباعة (سلسلة)

انتاج:

أنا أحب جافا!

أنا أحب بايثون!

في البرنامج أعلاه ، قمنا بتعريف دالة func () ، وداخلها ، لدينا سلسلة متغيرة بقيمة "أنا أحب Java!". إذن ، هذا المتغير محلي بالنسبة للدالة func (). بعد ذلك ، لدينا المتغير العام كما في السابق ، ثم نسمي الوظيفة وبيان الطباعة. أولاً ، يتم تشغيل الوظيفة ، واستدعاء عبارة print لتلك الوظيفة وتقديم الإخراج "أنا أحب Java!" - وهو المتغير المحلي لتلك الوظيفة. بعد ذلك ، بمجرد خروج البرنامج من نطاق الوظيفة ، يتم تغيير قيمة s إلى "أنا أحب Python" ، ولهذا السبب نحصل على كلا السطرين كمخرجات.

الآن ، دعونا نضيف المثالين الأولين ، ونحاول الوصول إلى السلسلة باستخدام جملة print ، ثم نحاول تعيين قيمة جديدة لها. بشكل أساسي ، نحاول إنشاء سلسلة كمتغير محلي وعالمي.

لحسن الحظ ، لا تسمح بايثون بهذا الالتباس وتلقي بخطأ. إليك الطريقة:

برنامج:

def func ():

طباعة (سلسلة)

سلسلة = "أحب جافا!"

طباعة (سلسلة)

string = "أحب بايثون!"

func ()

الإخراج (خطأ):

——————————————————————————

UnboundLocalError Traceback (آخر مكالمة أخيرة)

<ipython-input-3-d7a23bc83c27> في <module>

5

6 string = "أحب بايثون!"

—-> 7 func ()

<ipython-input-3-d7a23bc83c27> في func ()

1 وظيفة def ():

—-> 2 طباعة (سلسلة)

3 string = "I love Java!"

4 طباعة (سلسلة)

5

UnboundLocalError: تمت الإشارة إلى المتغير المحلي قبل التعيين

من الواضح أن Python لا تسمح للمتغير أن يكون عالميًا ومحليًا داخل دالة. لذلك ، فإنه يعطينا متغيرًا محليًا لأننا نخصص قيمة للسلسلة داخل func (). نتيجة لذلك ، يعرض أول بيان طباعة إشعار الخطأ. جميع المتغيرات التي تم إنشاؤها أو تغييرها في نطاق أي وظيفة محلية ما لم يتم الإعلان عنها على أنها "عالمية" بشكل صريح.

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

الكلمة الأساسية العامة ضرورية لإبلاغ Python بأننا نصل إلى المتغيرات العالمية. إليك الطريقة:

برنامج:

def func ():

سلسلة عالمية

طباعة (سلسلة)

string = "لكني أريد أن أتعلم Python أيضًا!"

طباعة (سلسلة)

string = "أنا أتطلع لتعلم Java!"

func ()

طباعة (سلسلة)

انتاج:

أنا أتطلع لتعلم جافا!

لكني أريد أن أتعلم بايثون أيضًا!

لكني أريد أن أتعلم بايثون أيضًا!

كما ترى من المخرجات ، تتعرف Python على المتغيرات العامة هنا وتقوم بتقييم بيان الطباعة وفقًا لذلك ، مع إعطاء الإخراج المناسب.

استخدام المتغيرات العامة في الوظائف المتداخلة

الآن ، دعونا نفحص ما سيحدث إذا تم استخدام المتغيرات العامة في الدوال المتداخلة. تحقق من هذا المثال حيث يتم تعريف المتغير "اللغة" واستخدامه في نطاقات مختلفة:

برنامج:

def func ():

اللغة = "الإنجليزية"

def func1 ():

لغة عالمية

اللغة = "الإسبانية"

طباعة ("قبل استدعاء func1:" + لغة)

print ("استدعاء func1 الآن:")

func1 ()

طباعة ("بعد استدعاء func1:" + لغة)

func ()

طباعة ("قيمة اللغة الرئيسية:" + اللغة)

انتاج:

قبل استدعاء func1: اللغة الإنجليزية

استدعاء func1 الآن:

بعد استدعاء func1: اللغة الإنجليزية

قيمة اللغة الرئيسية: الإسبانية

كما ترى ، فإن الكلمة الأساسية العامة ، عند استخدامها داخل func1 المتداخلة ، ليس لها أي تأثير على "اللغة" المتغيرة للوظيفة الأم. بمعنى ، يتم الاحتفاظ بالقيمة على أنها "إنجليزية". يوضح هذا أيضًا أنه بعد استدعاء func () ، يوجد متغير "لغة" في مساحة اسم الوحدة النمطية بقيمة "Spanish".

تتوافق هذه النتيجة مع ما توصلنا إليه في القسم السابق أيضًا - أن المتغير ، عند تعريفه داخل جسم الوظيفة ، يكون دائمًا محليًا ما لم يتم تحديد خلاف ذلك. ومع ذلك ، يجب أن تكون هناك آلية للوصول إلى المتغيرات التي تنتمي إلى نطاقات أخرى مختلفة أيضًا.

هذا هو المكان الذي تأتي فيه المتغيرات غير المحلية!

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

المتغيرات غير المحلية هي أنواع جديدة من المتغيرات التي قدمتها Python3. هذه لها الكثير من القواسم المشتركة مع المتغيرات العالمية وهي مهمة للغاية أيضًا. ومع ذلك ، فإن أحد الاختلافات بين المتغيرات غير المحلية والمتغيرات العالمية هو أن المتغيرات غير المحلية لا تجعل من الممكن تغيير المتغيرات من نطاق الوحدة النمطية.

تحقق من الأمثلة التالية لفهم هذا:

برنامج:

def func ():

لغة عالمية

طباعة (لغة)

اللغة = "الألمانية"

func ()

انتاج:

ألمانية

كما هو متوقع ، يقوم البرنامج بإرجاع "فرانكفورت" كناتج. الآن ، دعونا نغير "عالمي" إلى "غير محلي" ونرى ما سيحدث:

برنامج:

def func ():

لغة غير محلية

طباعة (لغة)

اللغة = "الألمانية"

func ()

انتاج:

ملف “<ipython-input-9-97bb311dfb80>” ، السطر 2

لغة غير محلية

^

خطأ في تركيب الجملة: لم يتم العثور على ارتباط لـ "لغة" غير محلية

كما ترى ، فإن البرنامج أعلاه يلقي خطأ في بناء الجملة. يمكننا أن نفهم من هنا أن التخصيصات غير المحلية لا يمكن إجراؤها إلا من خلال تعريف الوظائف المتداخلة. يجب تحديد المتغيرات غير المحلية ضمن نطاق الوظيفة ، وإذا لم يكن الأمر كذلك ، فلن تجد تعريفها في النطاق المتداخل أيضًا. الآن ، تحقق من البرنامج التالي:

برنامج:

def func ():

اللغة = "الإنجليزية"

def func1 ():

لغة غير محلية

اللغة = "الألمانية"

طباعة ("قبل استدعاء func1:" + لغة)

print ("استدعاء func1 الآن:")

func1 ()

طباعة ("بعد استدعاء func1:" + لغة)

اللغة = "الإسبانية"

func ()

طباعة ("اللغة" في الأساس: "+ اللغة)

انتاج:

قبل استدعاء func1: اللغة الإنجليزية

استدعاء func1 الآن:

بعد استدعاء func1: الألمانية

"اللغة" في اللغة الرئيسية: الإسبانية

يعمل البرنامج أعلاه لأنه تم تعريف المتغير "اللغة" قبل استدعاء func1 (). إذا لم يتم تعريفه ، فسنحصل على خطأ كما يلي:

برنامج:

def func ():

#language = "الإنجليزية"

def func1 ():

لغة غير محلية

اللغة = "الألمانية"

طباعة ("قبل استدعاء func1:" + لغة)

print ("استدعاء func1 الآن:")

func1 ()

طباعة ("بعد استدعاء func1:" + لغة)

اللغة = "الإسبانية"

func ()

طباعة ("اللغة" في الأساس: "+ اللغة)

انتاج:

ملف “<ipython-input-11-5417be93b6a6>” ، السطر 4

لغة غير محلية

^

خطأ في تركيب الجملة: لم يتم العثور على أي ارتباط لـ "لغة" غير محلية

ومع ذلك ، سيعمل البرنامج بشكل جيد إذا استبدلنا nonlocal بـ global:

برنامج:

def func ():

#language = "الإنجليزية"

def func1 ():

لغة عالمية

اللغة = "الألمانية"

print (“قبل استدعاء func1`:” + لغة)

print ("استدعاء func1 الآن:")

func1 ()

طباعة ("بعد استدعاء func1:" + لغة)

اللغة = "الإسبانية"

func ()

طباعة ("اللغة" في الأساس: "+ اللغة)

انتاج:

قبل استدعاء func1: اللغة الإنجليزية

استدعاء func1 الآن:

بعد استدعاء func1: الألمانية

اللغة الرئيسية: الألمانية

إذا لاحظت أن قيمة المتغير العام (اللغة) تتغير أيضًا في البرنامج أعلاه! هذه هي القوة التي تجلبها المتغيرات غير المحلية معهم!

ختاما

في هذه المقالة ، ناقشنا المتغيرات المحلية والعالمية وغير المحلية في Python ، جنبًا إلى جنب مع حالات الاستخدام المختلفة والأخطاء المحتملة التي يجب عليك البحث عنها. مع هذه المعرفة بجانبك ، يمكنك المضي قدمًا والبدء في التدرب على أنواع مختلفة من المتغيرات وملاحظة الاختلافات الدقيقة.

Python هي لغة برمجة شائعة للغاية في جميع أنحاء العالم - خاصةً عندما يتعلق الأمر بحل المشكلات والتحديات المتعلقة بالبيانات. في upGrad ، لدينا قاعدة من المتعلمين في أكثر من 85 دولة ، مع أكثر من 40.000 متعلم مدفوع الأجر على مستوى العالم ، وقد أثرت برامجنا على أكثر من 500.000 من المهنيين العاملين. تم تصميم دوراتنا في علوم البيانات والتعلم الآلي لمساعدة الطلاب المتحمسين من أي خلفية على بدء رحلتهم والتفوق في مجال علم البيانات. تضمن مساعدتنا المهنية بزاوية 360 درجة أنه بمجرد تسجيلك معنا ، فإن حياتك المهنية تتقدم فقط. تواصل معنا اليوم واختبر قوة التعلم من الأقران والشبكات العالمية!

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

بناءً على نطاقها ، فإن المتغيرات في Python إما محلية أو عالمية أو غير محلية.

هل يمكن الوصول إلى المتغيرات العامة في بايثون من داخل دالة؟

نعم ، يمكن الوصول إلى المتغيرات العامة من داخل دالة في Python.

ما هو الفرق بين المتغيرات المحلية والعالمية؟

المتغيرات العالمية لها البرنامج بأكمله كنطاقها ، في حين أن المتغيرات المحلية لها فقط الوظيفة التي يتم تعريفها على أنها نطاقها.