عند تعلم القوائم Lists في Python ستقابل كثيرًا الدالتين append() و extend(). وفي البداية قد تظن أن الدالتين تقومان بنفس الوظيفة، لأن كل واحدة منهما تُستخدم لإضافة عناصر إلى القائمة.
لكن الفرق بينهما مهم جدًا: append تضيف عنصرًا واحدًا كما هو، بينما extend تضيف عناصر الكائن القابل للتكرار واحدًا واحدًا. هذا الفرق البسيط قد يغيّر شكل القائمة بالكامل، وقد يسبب نتائج غير متوقعة إذا لم تنتبه له.
في هذا الدرس من بايثون العرب سنشرح الفرق بين append و extend بطريقة مبسطة، مع أمثلة عملية، وجداول مقارنة، وأخطاء شائعة حتى تعرف متى تستخدم كل دالة بشكل صحيح.
{getToc} $title={محتوى المقال}
{alertInfo} هذا الدرس مهم لكل مبتدئ في بايثون، لأن الخلط بين append و extend من أكثر الأخطاء الشائعة عند التعامل مع Lists.
إذا كنت جديدًا في القوائم، أنصحك بمراجعة درس: أساسيات بايثون 16: شرح Lists في Python للمبتدئين قبل متابعة هذا المقال.
ما هي List في Python؟
القائمة List في Python هي نوع بيانات يسمح لك بتخزين عدة عناصر داخل متغير واحد. يمكن أن تحتوي القائمة على نصوص، أرقام، قيم منطقية، أو حتى قوائم أخرى.
مثال:
fruits = ["apple", "banana", "cherry"]
print(fruits)
الناتج:
['apple', 'banana', 'cherry']
القوائم من أكثر أنواع البيانات استخدامًا في بايثون، ولهذا من المهم أن تفهم كيف تضيف إليها عناصر بطريقة صحيحة.
ما وظيفة append في Python؟
الدالة append() تستخدم لإضافة عنصر واحد فقط إلى نهاية القائمة. هذا العنصر قد يكون نصًا، رقمًا، قاموسًا، Tuple، أو حتى قائمة كاملة.
مثال بسيط:
fruits = ["apple", "banana"]
fruits.append("cherry")
print(fruits)
الناتج:
['apple', 'banana', 'cherry']
هنا أضافت append() العنصر "cherry" في نهاية القائمة.
{alertSuccess} استخدم append عندما تريد إضافة عنصر واحد فقط إلى نهاية القائمة.
ماذا يحدث إذا استخدمنا append مع قائمة؟
هنا تظهر النقطة التي تخلط على كثير من المبتدئين. إذا مررت قائمة إلى append()، فإن بايثون ستضيف هذه القائمة كاملة كعنصر واحد داخل القائمة الأصلية.
numbers = [1, 2, 3]
numbers.append([4, 5])
print(numbers)
الناتج:
[1, 2, 3, [4, 5]]
لاحظ أن [4, 5] لم يتم دمجها مع القائمة الأصلية، بل أصبحت عنصرًا واحدًا داخلها. هذا يسمى أحيانًا قائمة داخل قائمة أو Nested List.
{alertWarning} إذا استخدمت append مع List، سيتم إدخال القائمة كاملة كعنصر واحد، وليس دمج عناصرها داخل القائمة الأصلية.
ما وظيفة extend في Python؟
الدالة extend() تستخدم لإضافة عناصر كائن قابل للتكرار iterable إلى القائمة، عنصرًا عنصرًا.
بمعنى أبسط: إذا أعطيت extend() قائمة ثانية، فإنها لا تضيف القائمة كعنصر واحد، بل تضيف عناصرها داخل القائمة الأصلية.
numbers = [1, 2, 3]
numbers.extend([4, 5])
print(numbers)
الناتج:
[1, 2, 3, 4, 5]
هنا تم دمج الرقمين 4 و 5 داخل القائمة الأصلية كعناصر منفصلة.
الفرق بين append و extend باختصار
| الدالة | ماذا تفعل؟ | متى أستخدمها؟ |
|---|---|---|
append() |
تضيف عنصرًا واحدًا كما هو في نهاية القائمة | عندما تريد إضافة قيمة واحدة أو عنصر واحد |
extend() |
تضيف عناصر iterable واحدًا واحدًا إلى القائمة | عندما تريد دمج قائمة أو مجموعة عناصر داخل قائمة |
القاعدة المختصرة:
appendتضيف الشيء كاملًا كما هو.extendتفتح الشيء القابل للتكرار وتضيف عناصره واحدًا واحدًا.
مثال يوضح الفرق بين append و extend
لنقارن بين الطريقتين في مثال واحد:
list_one = [1, 2, 3]
list_two = [1, 2, 3]
list_one.append([4, 5])
list_two.extend([4, 5])
print("append:", list_one)
print("extend:", list_two)
الناتج:
append: [1, 2, 3, [4, 5]]
extend: [1, 2, 3, 4, 5]
في نتيجة append أصبحت [4, 5] عنصرًا واحدًا داخل القائمة. أما في نتيجة extend فقد تم دمج 4 و 5 كعناصر منفصلة.
هل يمكن استخدام extend مع النصوص؟
نعم، يمكن استخدام extend() مع النصوص، لكن انتبه جيدًا؛ لأن النص في Python يعتبر كائنًا قابلًا للتكرار، أي يمكن المرور على حروفه حرفًا حرفًا.
letters = ["A", "B"]
letters.extend("CD")
print(letters)
الناتج:
['A', 'B', 'C', 'D']
هنا أضافت extend() الحرف C ثم الحرف D، لأنها تعاملت مع النص كحروف منفصلة.
{alertWarning} استخدام extend مع النصوص قد يعطيك نتيجة غير متوقعة إذا كنت تريد إضافة النص كاملًا كعنصر واحد.
ماذا لو استخدمنا append مع نص؟
إذا استخدمنا append() مع نص، سيتم إضافة النص كاملًا كعنصر واحد.
letters = ["A", "B"]
letters.append("CD")
print(letters)
الناتج:
['A', 'B', 'CD']
هنا الفرق واضح: append أضافت النص كاملًا، بينما extend أضافت كل حرف وحده.
هل append و extend تغيران القائمة الأصلية؟
نعم. كل من append() و extend() تعدلان القائمة الأصلية مباشرة، ولا تُرجعان قائمة جديدة.
مثال:
numbers = [1, 2]
result = numbers.append(3)
print(numbers)
print(result)
الناتج:
[1, 2, 3]
None
لاحظ أن القائمة الأصلية تغيرت، لكن المتغير result أصبح None، لأن append() لا ترجع القائمة بعد التعديل.
{alertError} لا تكتب numbers = numbers.append(3)، لأن append ترجع None وليس القائمة الجديدة.
نفس الخطأ يحدث مع extend أيضًا
الدالة extend() أيضًا تعدل القائمة الأصلية وترجع None. لذلك لا تخزن نتيجتها في نفس المتغير.
كود خاطئ:
numbers = [1, 2]
numbers = numbers.extend([3, 4])
print(numbers)
الناتج:
None
الصحيح:
numbers = [1, 2]
numbers.extend([3, 4])
print(numbers)
الناتج:
[1, 2, 3, 4]
متى أستخدم append؟
استخدم append() عندما تريد إضافة عنصر واحد فقط إلى نهاية القائمة.
أمثلة مناسبة لاستخدام append():
- إضافة اسم طالب واحد إلى قائمة الطلاب.
- إضافة رقم واحد إلى قائمة الأرقام.
- إضافة قاموس واحد داخل قائمة.
- إضافة قائمة كاملة كعنصر واحد داخل قائمة أخرى.
مثال:
students = ["Ahmed", "Sara"]
students.append("Omar")
print(students)
الناتج:
['Ahmed', 'Sara', 'Omar']
متى أستخدم extend؟
استخدم extend() عندما تريد إضافة أكثر من عنصر دفعة واحدة إلى القائمة.
أمثلة مناسبة لاستخدام extend():
- دمج قائمتين من الأسماء.
- إضافة عدة أرقام دفعة واحدة.
- إضافة عناصر Tuple إلى List.
- دمج نتائج قادمة من أكثر من مصدر داخل قائمة واحدة.
مثال:
students = ["Ahmed", "Sara"]
new_students = ["Omar", "Lina"]
students.extend(new_students)
print(students)
الناتج:
['Ahmed', 'Sara', 'Omar', 'Lina']
هل يمكن استخدام علامة + بدل extend؟
نعم، يمكنك دمج قائمتين باستخدام علامة +، لكنها تختلف عن extend() في نقطة مهمة: علامة + تنشئ قائمة جديدة، بينما extend() تعدل القائمة الأصلية.
list1 = [1, 2]
list2 = [3, 4]
result = list1 + list2
print(result)
الناتج:
[1, 2, 3, 4]
إذا كنت تريد الحفاظ على القائمة الأصلية بدون تعديل، فقد تكون علامة + مناسبة. أما إذا كنت تريد تعديل القائمة نفسها، فاستخدم extend().
الفرق بين append و extend و +
| الطريقة | ماذا تفعل؟ | هل تعدل القائمة الأصلية؟ | متى تستخدمها؟ |
|---|---|---|---|
append() |
تضيف عنصرًا واحدًا كما هو | نعم | عند إضافة عنصر واحد فقط |
extend() |
تضيف عناصر iterable واحدًا واحدًا | نعم | عند دمج عدة عناصر داخل القائمة |
+ |
تدمج قائمتين وتنتج قائمة جديدة | لا، إلا إذا خزنت الناتج في نفس المتغير | عندما تريد إنشاء قائمة جديدة من قائمتين |
جدول مقارنة سريع بين append و extend
| السؤال | append | extend |
|---|---|---|
| هل تضيف عنصرًا واحدًا؟ | نعم | لا، تضيف عدة عناصر من iterable |
| ماذا يحدث عند تمرير List؟ | تضيف القائمة كاملة كعنصر واحد | تضيف عناصر القائمة واحدًا واحدًا |
| هل تغير القائمة الأصلية؟ | نعم | نعم |
| هل ترجع قائمة جديدة؟ | لا، ترجع None | لا، ترجع None |
| هل تصلح لإضافة نص كامل كعنصر؟ | نعم | لا غالبًا، لأنها تضيف حروف النص كعناصر |
أخطاء شائعة عند استخدام append و extend
الخطأ الأول: توقع أن append تدمج عناصر القائمة
هذا الكود لا يدمج العناصر:
items = ["A", "B"]
items.append(["C", "D"])
print(items)
الناتج:
['A', 'B', ['C', 'D']]
إذا أردت دمج العناصر، استخدم extend():
items = ["A", "B"]
items.extend(["C", "D"])
print(items)
الناتج:
['A', 'B', 'C', 'D']
الخطأ الثاني: تخزين نتيجة append في نفس المتغير
هذا كود خاطئ:
numbers = [1, 2]
numbers = numbers.append(3)
print(numbers)
الناتج:
None
الصحيح:
numbers = [1, 2]
numbers.append(3)
print(numbers)
الخطأ الثالث: استخدام extend لإضافة نص كامل
إذا كتبت:
words = ["Python"]
words.extend("Code")
print(words)
ستكون النتيجة:
['Python', 'C', 'o', 'd', 'e']
إذا أردت إضافة النص كاملًا كعنصر واحد، استخدم append():
words = ["Python"]
words.append("Code")
print(words)
مثال عملي: قائمة طلاب
لنفترض أن لدينا قائمة طلاب، ونريد إضافة طالب واحد ثم إضافة مجموعة طلاب دفعة واحدة.
students = ["Ali", "Sara"]
# إضافة طالب واحد
students.append("Omar")
# إضافة عدة طلاب
students.extend(["Lina", "Mona"])
print(students)
الناتج:
['Ali', 'Sara', 'Omar', 'Lina', 'Mona']
هنا استخدمنا append() مع الطالب الواحد، واستخدمنا extend() مع قائمة الطلاب الجدد.
تمرين بسيط
ما الناتج المتوقع من الكود التالي؟
items = ["A", "B"]
items.append(["C", "D"])
print(items)
الإجابة:
['A', 'B', ['C', 'D']]
لأن append() أضافت القائمة كاملة كعنصر واحد.
جرّب الآن استبدال append بـ extend ولاحظ الفرق.
أسئلة شائعة عن append و extend
ما الفرق بين append و extend في Python؟
append() تضيف عنصرًا واحدًا كما هو إلى نهاية القائمة، أما extend() فتضيف عناصر الكائن القابل للتكرار واحدًا واحدًا داخل القائمة.
متى أستخدم append؟
استخدم append() عندما تريد إضافة عنصر واحد فقط، مثل رقم أو نص أو قاموس أو قائمة كاملة كعنصر مستقل.
متى أستخدم extend؟
استخدم extend() عندما تريد إضافة عدة عناصر إلى القائمة، مثل دمج قائمة أخرى أو Tuple داخل القائمة.
هل append ترجع القائمة بعد الإضافة؟
لا، append() تعدل القائمة الأصلية وترجع None.
هل extend ترجع قائمة جديدة؟
لا، extend() تعدل القائمة الأصلية أيضًا وترجع None.
هل يمكن استخدام + بدل extend؟
نعم، لكن علامة + تنشئ قائمة جديدة من دمج قائمتين، بينما extend() تعدل القائمة الأصلية مباشرة.
روابط مفيدة
- أساسيات بايثون 16: شرح Lists في Python للمبتدئين
- بايثون بالمثال: جمع عناصر قائمة في Python
- الفرق بين List و Tuple و Set و Dictionary في Python
- محرر بايثون العرب لتجربة الأكواد أونلاين
- توثيق Python الرسمي حول هياكل البيانات
الخلاصة
في هذا المقال تعلمنا الفرق بين append() و extend() في Python، وفهمنا أن الاختلاف بينهما يظهر بوضوح عند إضافة قائمة داخل قائمة أخرى.
append()تضيف عنصرًا واحدًا كما هو.extend()تضيف عناصر iterable واحدًا واحدًا.- الدالتان تعدلان القائمة الأصلية.
- الدالتان لا ترجعان قائمة جديدة، بل ترجعان
None. - علامة
+يمكن أن تدمج قائمتين لكنها تنشئ قائمة جديدة.
{alertSuccess} الخلاصة السريعة: إذا أردت إضافة عنصر واحد استخدم append، وإذا أردت دمج عدة عناصر داخل القائمة استخدم extend.