هذا المقال يتطلب مستوى: مبتدئ. لو انت لسه بادئ في بايثون، الكلام ده مكتوب لك بالظبط.
الفرق بين is و== في بايثون
لو استخدمت is عشان تقارن رقمين وطلعت النتيجة صح، ده مش دليل إن كودك سليم. المقال ده هيوريك ليه a is b ممكن يطلع False رغم إن a وb فيهم نفس الرقم، وإمتى تستخدم is وإمتى تستخدم ==. المكسب: تبطّل باج بيظهر فجأة على أرقام كبيرة.
المشكلة باختصار
في بايثون فيه طريقتين للمقارنة بيتلخبطوا مع بعض. == بتسأل: القيمتين متساويتين؟ وis بتسأل سؤال تاني خالص: هو ده نفس الكائن في الذاكرة؟ الفرق ده بيعدّي عليك من غير ما تحس، لحد ما كودك يشتغل صح على 100 ويفشل على 1000.
الفكرة بمثال بسيط
تخيّل توأمين متطابقين. لو سألت: "همّا متشابهين؟" الجواب أيوه. لكن لو سألت: "همّا نفس الشخص؟" الجواب لأ، دول اتنين. == بتقيس التشابه (القيمة)، وis بتقيس إنهم نفس الشخص (نفس المكان في الذاكرة).
مثال تاني أقرب للكود: عندك صورتين مطبوعتين من نفس الملف. الصورتين متطابقتين (== يقول True)، بس كل ورقة ليها مكان مختلف على المكتب (is يقول False). ركز على النقطة دي، هي مفتاح الموضوع كله.
التفسير العلمي بالتفصيل
أي كائن في بايثون ليه عنوان في الذاكرة بتشوفه بدالة id(). عامل == بينادي التابع __eq__ اللي بيقارن المحتوى. عامل is بيقارن ناتج id() للكائنين، يعني بيقارن العنوانين مباشرة. لما تكتب a = 1000 وb = 1000، بايثون بيعمل كائنين منفصلين في عنوانين مختلفين، فـis بترجع False رغم تساوي القيمة.
a = 1000
b = 1000
print(a == b) # True -> القيمتان متساويتان
print(a is b) # False -> كائنان مختلفان في الذاكرة
print(id(a), id(b)) # عنوانان مختلفان
x = 100
y = 100
print(x is y) # True غالبًا -> بسبب مخزن الأعداد الصغيرة
ليه النتيجة بتنقلب عند 256؟
هنا الجزء اللي بيلغبط المبتدئين. في تطبيق CPython (اللي بتستخدمه غالبًا)، بايثون بيجهّز مسبقًا كائنات ثابتة للأعداد الصحيحة من -5 لحد 256. أي متغيّرين قيمتهم في المدى ده بيشاوروا على نفس الكائن، فـis بترجع True. أول ما تعدّي 256، بايثون بيعمل كائن جديد كل مرة، فـis بترجع False. عشان كده 100 is 100 بيطلع True و1000 is 1000 بيطلع False.