اذهب إلى المحتوى

السؤال

نشر

كنت أقوم بدراسة التوابع فظهر لي مثال لتابع داخل تابع و حاولت تقليده في المثال التالي:

def f(name):
  def say_hello():
    print(f'hello {name}')
  return say_hello

g = f('ali')
g()

لكن لم أفهم تماماً لماذا قام بطباعة hello ali كيف عرف التابع say_hello قيمة name مع أننا لم نقم بتمريرها له.

Recommended Posts

  • 1
نشر

إن هذا المفهوم يدعى ال closure و هو عبارة عن فضاء اسماء يضاف إلى فضاء الأسماء المحلي الخاص بالتابع، عندما تقوم بكتابة تابع داخل تابع فإن التابع الداخلي يستطيع الوصول إلى كافة المتحولات المعرفة (و الممررة) في التابع الخارجي، و بالتالي هذه المتحولات ستكون ضمن فضاء الاسماء الخاص به.
عند إرجاع هذا التابع فإن فضاء الأسماء الخاص به سيكون يحتوي على هذه المتحولات و بالتالي ستأخذ القيمة الصحيحة لها.
بشكل دقيق هنا في مثالك هذا، فإن التابع say_hello هو تابع داخلي بينما التابع f هو تابع خارجي.
التابع say_hello يستطيع الوصول إلى المتحول name بشكل طبيعي حيث أنه معرف داخل التابع f، و عند تمرير اسمك (أي قيمة محددة) للتابع f فإن هذا المتحول أخذ قيمة هي اسمك، و هذا القيمة أصبحت مرتبطة بالمتحول في فضاء الاسماء و بالتالي الأمر ذاته بالنسبة للتابع say_hello و عند إرجاع هذا التابع ستكون القيمة لا تزال في فضاء اسماءه و هذا ما ظهر من خلال المثال عندما قام بطباعة القيمة المطلوبة للمتحول name.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...