الفرق بين ‎append()‎ و‎extend()‎ في قوائم بايثون مع أمثلة عملية

دقائق القراءة: 5

مقدمة: كيف تضيف عناصر إلى القوائم في بايثون؟

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

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

شرح الفرق بين append و extend في قوائم بايثون مع أمثلة برمجية

استخدام العامل + لدمج القوائم في بايثون

قبل الانتقال إلى append() وextend()، من المفيد فهم ما يفعله العامل + عند استخدامه مع القوائم. هذا العامل لا يعدّل القائمة الأصلية، بل ينشئ قائمة جديدة تضم عناصر القائمتين.

list_1 = [1, 2, 3, 4, 5]
list_2 = [6, 7, 8]

print(list_1 + list_2)
# Output: [1, 2, 3, 4, 5, 6, 7, 8]

print(list_1)
# Output: [1, 2, 3, 4, 5]

print(list_2)
# Output: [6, 7, 8]

من المثال السابق نلاحظ ما يلي:

  • التعبير list_1 + list_2 لا يضيف عناصر list_2 داخل list_1 مباشرة.
  • ينتج عنه كائن جديد من نوع قائمة.
  • كل من list_1 وlist_2 تبقيان دون تغيير.

إذا كان هدفك إنشاء قائمة جديدة، فالعامل + مناسب. أما إذا أردت تعديل القائمة الأصلية نفسها، فستحتاج إلى append() أو extend().

متى تستخدم append() في بايثون؟

الدالة append() تُستخدم لإضافة عنصر واحد إلى نهاية القائمة. المهم هنا أن الإضافة تتم على شكل عنصر واحد فقط، حتى لو كان هذا العنصر نفسه قائمة كاملة.

إضافة قائمة داخل قائمة باستخدام append()

list_1 = [1, 2, 3, 4, 5]
list_2 = [6, 7, 8]

list_1.append(list_2)
print(list_1)
# Output: [1, 2, 3, 4, 5, [6, 7, 8]]

print(len(list_1))
# Output: 6

هنا تمت إضافة list_2 كعنصر واحد في نهاية list_1، وليس كعناصر منفصلة. لذلك زاد طول القائمة بمقدار 1 فقط.

هذا السلوك مفيد عندما تريد الاحتفاظ بقائمة متداخلة nested list، لكنّه ليس الخيار المناسب إذا كنت تريد دمج العناصر فردياً.

متى تكون append() الخيار الصحيح؟

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

متى تستخدم extend() في بايثون؟

الدالة extend() تُستخدم عندما تريد إضافة عناصر كائن قابل للتكرار iterable إلى القائمة، بحيث تُضاف العناصر واحداً تلو الآخر.

الفكرة الداخلية وراء extend()

لفهم سلوك extend()، تخيل أنك تنفذ حلقة for تمر على العناصر ثم تضيف كل عنصر باستخدام append():

list_1 = [1, 2, 3, 4, 5]
list_2 = [6, 7, 8]

for item in list_2:
    list_1.append(item)

print(list_1)
# Output: [1, 2, 3, 4, 5, 6, 7, 8]

هذا هو تقريباً ما تفعله extend() بشكل مباشر وأكثر وضوحاً في الكتابة.

استخدام extend() لدمج عناصر قائمتين

list_1 = [1, 2, 3, 4, 5]
list_2 = [6, 7, 8]

list_1.extend(list_2)
print(list_1)
# Output: [1, 2, 3, 4, 5, 6, 7, 8]

print(len(list_1))
# Output: 8

في هذا المثال، تمت إضافة عناصر list_2 إلى list_1 كعناصر مستقلة. إذا كان طول القائمة الأولى هو len1 وطول الثانية هو len2، فسيصبح الطول النهائي بعد extend() مساوياً لـ len1 + len2.

أهم استخدامات extend()

  • دمج عناصر قائمة داخل قائمة أخرى.
  • إضافة مجموعة من القيم دفعة واحدة.
  • التعامل مع أي كائن قابل للتكرار مثل القوائم والسلاسل النصية والصفوف tuples والمجموعات sets.

الفرق الجوهري بين append() وextend()

المقارنة append() extend()
نوع الإضافة إضافة عنصر واحد إضافة عدة عناصر من كائن قابل للتكرار
عند تمرير قائمة تُضاف كعنصر واحد تُفكك وتُضاف عناصرها فردياً
تأثيرها على الطول يزيد بمقدار 1 يزيد بعدد العناصر المضافة
تقبل القيم غير القابلة للتكرار نعم لا

ماذا يحدث عند إضافة عنصر مفرد؟

إذا أردت إضافة قيمة واحدة فقط، مثل القيمة المنطقية True، فإن append() هي الخيار الصحيح.

list_1 = [1, 2, 3, 4, 5]
list_1.append(True)
print(list_1)
# Output: [1, 2, 3, 4, 5, True]

أما إذا حاولت استخدام extend() مع قيمة منطقية مفردة، فستحصل على خطأ لأن True ليس كائناً قابلاً للتكرار.

list_1 = [1, 2, 3, 4, 5]
list_1.extend(True)
print(list_1)

# Output:
# TypeError: 'bool' object is not iterable

سبب ظهور الخطأ

الرسالة TypeError: 'bool' object is not iterable تعني أن الدالة extend() تتوقع وسيطاً يمكن المرور على عناصره باستخدام التكرار، مثل:

  • list
  • tuple
  • set
  • str

أما القيم الفردية مثل True أو الأعداد الصحيحة، فلا يمكن تفكيكها إلى عناصر متتالية، لذلك تفشل العملية.

الصيغة العامة للدالة هي: list_name.extend(iterable).

التعامل مع السلاسل النصية باستخدام append() وextend()

السلسلة النصية string في Python تُعد كائناً قابلاً للتكرار، لأنك تستطيع المرور على حروفها حرفاً حرفاً. لهذا السبب يختلف سلوك append() وextend() عند تمرير نص.

إضافة النص كاملاً باستخدام append()

list_1 = [1, 2, 3, 4, 5]
list_1.append('Happy')
print(list_1)
# Output: [1, 2, 3, 4, 5, 'Happy']

في هذا المثال، تمت إضافة النص 'Happy' كعنصر واحد داخل القائمة.

إضافة حروف النص باستخدام extend()

list_1 = [1, 2, 3, 4, 5]
list_1.extend('Happy')
print(list_1)
# Output: [1, 2, 3, 4, 5, 'H', 'a', 'p', 'p', 'y']

هنا قامت extend() بتفكيك النص إلى أحرف منفصلة، ثم أضافت كل حرف كعنصر مستقل داخل القائمة.

لذلك، إذا كنت تريد الاحتفاظ بالنص كوحدة واحدة، استخدم append(). وإذا كنت تريد إضافة الأحرف منفصلة، فاستخدم extend().

ملاحظات مهمة حول الأداء

من الناحية العملية، تعمل append() عادة بزمن ثابت تقريباً O(1) عند إضافة عنصر واحد إلى نهاية القائمة. في المقابل، يعتمد زمن تنفيذ extend() على عدد العناصر الموجودة في الكائن القابل للتكرار الممرر إليها، لذلك يرتبط أداؤها بطول هذا الكائن.

هذه المعلومة مهمة عند التعامل مع بيانات كبيرة، خاصة إذا كنت تبني قوائم ضمن حلقات أو تعالج مجموعات ضخمة من العناصر.

أفضل طريقة لاختيار الدالة المناسبة

  1. إذا كنت تريد إضافة عنصر واحد فقط، فاستخدم append().
  2. إذا كنت تريد ضم عناصر متعددة من قائمة أو نص أو أي iterable، فاستخدم extend().
  3. إذا كنت تحتاج إلى إنشاء قائمة جديدة بدلاً من تعديل القائمة الحالية، فيمكنك استخدام العامل +.

الخلاصة التقنية

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *