تكرار السؤال: …
الإجابة المختصرة
الكائن mutable يمكن تعديل محتواه في مكانه (مثل list و dict و set)، أما immutable فلا يتغير بعد إنشائه (مثل int و str و tuple و frozenset)، وأي "تعديل" عليه ينشئ كائنًا جديدًا.
الشرح
المتغيرات في Python أسماء تشير إلى كائنات. عند كتابة a = b يشير الاسمان إلى الكائن نفسه، فإذا كان mutable وعدّلته عبر أحد الاسمين ظهر التعديل في الآخر. هذا الفرق مهم عند تمرير الكائنات للدوال، وعند استخدامها كمفاتيح في dict أو عناصر في set (يجب أن تكون hashable، وهذا يتطلب عادةً عدم القابلية للتغيير). لاحظ أن tuple غير قابلة للتغيير لكنها قد تحتوي list قابلة للتغيير، فتصبح غير hashable.
مثال بالكود
a = [1, 2]
b = a
b.append(3)
print(a) # [1, 2, 3] — نفس الكائن
s = "hi"
t = s
t += "!"
print(s) # hi — t أصبح يشير لكائن جديدأخطاء شائعة
- الخلط بين تعديل الكائن (append) وإعادة ربط الاسم (=) بكائن جديد.
- افتراض أن tuple يمكن استخدامها دائمًا كمفتاح في dict حتى لو احتوت على list.