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

السؤال

نشر

كنت أقوم بكتابة تابع لإضافة مصفوفة إلى أخرى.

و لكن النتائج لا تأتي بالشكل الذي أتوقعه، هل يمكن ﻷحد مساعدتي في معرفة الخطأ.

def f(a1, a2=[]):
    for i in a1:
        a2.append(i)
    return a2


a = [1, 2, 3]
b = f(a)
print(b)

c = [1, 2, 3, 4]
d = f(c)
print(d)

 

Recommended Posts

  • 1
نشر (معدل)

الخطأ في هذا التابع هو أنك تقوم بإضافة قيمة افتراضية mutable و هذا يعني أنها قابلة للتعديل.

حيث أن البايثون يقوم بحساب قيم المتحولات الافتراضية مرة واحدة فقط عند التعريف و بعدها يقوم باستعمال القيمة التي لديه، و بالتالي عندما تقوم بتعديل القيمة أنت فإنك تعدل على القيمة الأصلية.

لحل هذه المشكلة يمكننا القيام بالتالي:

def f(a1, a2=None):
  	if a2 is None:
      a2 = []
    for i in a1:
        a2.append(i)
    return a2


a = [1, 2, 3]
b = f(a)
print(b)

c = [1, 2, 3, 4]
d = f(c)
print(d)

بالطبع يمكنك اختصار الوقت و استعمال التابع extend الذي يقوم بما تريده بالشكل التالي:

a = [1, 2, 3]
b = [4, 5]

a.extend(b)

 

تم التعديل في بواسطة Kais Hasan
  • 0
نشر

عند تشغيل السكريبت سيتم إستدعاء الدالة f وسيتم إضافة كل عنصر داخل المصفوفة a1 إلى المصفوفة a2، ثم سيعيد هذه المصفوفة، وعند إستدعاء الدالة f للمرة الثانية سوف يتم إستخدام المصفوفة a2 مرة أخرى والتي تحتوي بالفعل على كل عناصر المصفوفة a، ولحل المشكلة يجب أن نجعل قيمة المدخل a2 عبارة عن None على سبيل المثال ونتحقق من داخل الدالة أنه لم يتم تمرير أي مدخلات (أي قيمتها None وحينها نسند مصفوفة جديدة لها بالشكل التالي:

def f(a1, a2=None):
    if a2 is None:
        a2 = []
    for i in a1:
        a2.append(i)
    return a2


a = [1, 2, 3]
b = f(a)
print(b)

c = [1, 2, 3, 4]
d = f(c)
print(d)

"""
OUTPUT:
[1, 2, 3]
[1, 2, 3, 4]

"""

سبب هذه المشكلة هي أن لغة بايثون لا تقوم بتغير قيمة المدخلات في كل إستدعاء للدالة. 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...