• 1

لماذا يعمل المعامل += في حين يفشل + عند استخدامه مع القوائم في بايثون؟

عندما استخدم المعامل += مع القوائم يقوم بإنشاء قائمة تحتوي على سلاسل النصية المطلوبة في حين أنه عندما أستخدم المعامل + أحصل على رسالة خطأ، فما السبب؟

>>> x = []
>>> x += "hi"
>>> x
['h', 'i']
>>> x = x + "hi"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

هذا الخطأ يحدث بسبب خطأ بسيط للغاية في الفرق بين += و +، فعند استخدام الأولى مع قائمة فإنك تستدعي extend وليس +، وكما هو معروف فانه يمكنك استدعاء extend مع كائنات قابلة للتكرار (iterable) وأما + فيمكنك استخدامها فقط مع القوائم الأخرى.
ملاحظة: عند استخدامك لـ x += y فإن الإشارات الأخرى للقائمة سترى الاختلافات في حين أن هذا لن يحدث مع x = x + y، ولتفهم هذا الأمر بشكل أفضل أنظر إلى المثال التالي:

>>> x = ['a','b']
>>> y = ['c', d']
>>> z = x
>>> x += y
>>> z
['a', 'b', 'c', 'd']

>>> x = ['a','b']
>>> y = ['c', d']
>>> z = x
>>> x = x + y
>>> z
['a', 'b']

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

يعود السبب لكون المعامل += هو عبارة عن الوسيلة الخاصة __iadd__ المعرفة ضمن الصنف "قائمة" list وهي تقوم بعمل مشابه للوسيلة "مد"(بضم الميم) extend حيث يكون المعطى في حالتنا هو السلسلة التي بعد المعامل += الذي هو في مثالك السلسلة النصية "hi"، وفي الحالة التي فشلت فيها شفرتك فيعود السبب لكون المعامل + هو عبارة عن الوسيلة الخاصة __add__ المعرفة ضمن الصنف "قائمة" list وهي تقوم بعمل لا يشابه الوسيلة "مد"(بضم الميم) extend على الإطلاق فهي تأخذ معطى هو كائن قائمة list آخر حصرا وتجمع القائمتين أو بمعنى أدق تسلسلهما.

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن