• 0

لماذا تختلف i = i + 1 و i += 1 في بايثون؟

قيل لي أن هنالك فرق كبير بين i = i + 1 و i += 1 وأن ناتج السطرين يختلفان أيضا، فما الفرق بين هذين السطرين؟

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


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

نعم ناتج السطرين يختلفان، فسطر i += 1 يقوم بشيء مشابه لهذا:

try:
    i = i.__iadd__(1)
except AttributeError:
    i = i.__add__(1)

أما بالنسبة إلى i = i + 1 فإنها ستقوم بشيء مثل هذا:

i = i.__add__(1)

المشكلة تكمن في أنواع المتغيرات القابلة للتغيير مثل القوائم، حيث سيتحورون إلى __iadd__ (ومن ثم سيُرجعون self عند استدعاءهم إلا لو قمت بتغيير ذلك عن طريق إحدى الخدع)، بينما المتغيرات غير القابلة للتغيير مثل int فإن الطريقة السابقة لن تعمل معها.
مثال للتوضيح:

>>> l1 = []
>>> l2 = l1
>>> l1 += [3]
>>> l2
[3]

بسبب أن l2 لديها نفس كائن l1، وقد حورنا l1 فإنك سنحوّر l2 أيضا.
مثال آخر:

>>> l1 = []
>>> l2 = l1
>>> l1 = l1 + [3]
>>> l2
[]

في هذا المثال، لم نقم بتحوير l1 بل أنشئنا قائمة جديد، ومن ثم باستخدام l1 + [3] أضفنا [3] إلى l1 تاركا l2 تشير إلى القائمة الأصلية.

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


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

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

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

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


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

تسجيل الدخول

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


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