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

السؤال

نشر

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

>>> 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

 

Recommended Posts

  • 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']

 

  • 0
نشر

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...