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

السؤال

نشر

عندما أقوم بإستدعاء دالة وتقوم هذه الدالة بالتعديل على المدخلات لإستخدامها مرة أخرى، لا يتم تطبيق هذه التغيرات على المتغيرات نفسها، فعلى سبيل المثال:

def f(x, y):
    x = 1
    y.append(3)
    print('In f():', x, y)

x = 0
y = [0,1,2]
print('Before:', x, y)
f(x, y)
print('After: ', x, y)

تكون النتيجة كالتالي:

Before: 0 [0, 1, 2]
In f(): 1 [0, 1, 2, 3]
After:  0 [0, 1, 2, 3]

لماذا لم يتم تطبيق هذه التغيرات على المتغيرات المدخلة إلى الدالة f؟

Recommended Posts

  • 2
نشر

لتعديل المتغيرات داخل الدوال أو أي موقع في البرنامج يجب أن نجعل المتغير مقروء لكل أجزاء البرنامج، يمكننا ذلك عن طريق إستخدام الكلمة المحجوزة global والتي نعرفها قبل تغيير قيمة x داخل الدالة f، لكن لنقوم بإستخدامها لا يجب تمريرها بالدالة فهي أصبحت مقروءة بصورة أتوماتيكية، راجع البرنامج التالي:

def f(y):
    global x
    x = 1
    y.append(3)
    print('In f():', x, y)

x = 0
y = [0,1,2]
print('Before:', x, y)
f(y)
print('After: ', x, y)

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

Before: 0 [0, 1, 2]
In f(): 1 [0, 1, 2, 3]
After:  1 [0, 1, 2, 3]

 

 

 

  • 0
نشر

عند استدعاء الدالة ، تربط بايثون معاملات الدالة بأي كائنات تقوم بتمريرها في نطاق ال caller, يمكن أن تكون الكائنات قابلة للتغيير مثل القوائم أو غير قابلة للتغيير مثل الأعداد الصحيحة والنصوص, في المثال الذي قمت بارفاقه لديك متغيرين, المتغير x وهو عبارة عن عدد و y وهي عبارة عن قائمة , عند تمرير المتغيرين الى الدالة سوف يتم ربط هذه المتغيرات بمعاملات الدالة وبالتالي أي تغيير يطرأ على القوائم سوف يتم التأثير على المتغير الذي تم تمريره

  • 0
نشر

لأنك عندما تقوم بالتعديل على المتغيرات داخل الدالة فانت تقوم بتعديل متغيرات محلية local نسخة من المتغيرات الخارجية global ، والمتغيرات الخارجية global تبقى كما هي ، أي عندما يتم تمرير المتغيرات الى الدوال يتم إنشاء نسخة من هذه المتغيرات ولا يتم تعديل المتغيرات الأصلية

اما إذا أردت تغيير المتغييرات الخارجية global فيجب عليك إضافة الكلمة المحجوزة global لكي تقوم بتعديل المتغيرات الأصلية ، ولا تقوم بعمل نسخة محلية ، كما في الكود الآتي

def f():
    global x
    x = 1
    global y
    y.append(3)
    print('In f():', x, y)

x = 0
y = [0,1,2]
print('Before:', x, y)
f()
print('After: ', x, y)

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...