🎯 ما هي مشغلات الهوية (Identity Operators)؟
مشغلات الهوية في بايثون تستخدم لمقارنة هل يشير متغيران إلى نفس الكائن (Object) بالضبط في الذاكرة أم لا؟ وليس لمقارنة قيمتهما فقط.
يوجد مشغلان رئيسيان للهوية في بايثون:
is→ ينتجTrueإذا كان المتغيران يشيران إلى نفس الكائن في الذاكرة.is not→ ينتجTrueإذا كان المتغيران لا يشيران إلى نفس الكائن في الذاكرة.
فكر في الأمر كما يلي: لديك كتابان. إذا قارنت محتوى الصفحات وكانت متطابقة، فهذا مثل ==. أما إذا كانا نفس النسخة المادية من الكتاب، فهذا مثل is. 🧐
⚖️ الفرق الجوهري: is مقابل ==
هذا هو أهم جزء في الدرس! دعنا نوضح الفرق بمثال بسيط:
# مثال 1: المقارنة باستخدام == (قيم متساوية)
list_a = [1, 2, 3]
list_b = [1, 2, 3]
print(list_a == list_b) # True
# السبب: القيم داخل القائمتين متطابقة [1,2,3] == [1,2,3]
# مثال 2: المقارنة باستخدام is (نفس الكائن في الذاكرة)
print(list_a is list_b) # False
# السبب: list_a و list_b كائنان منفصلان في الذاكرة، رغم أن قيمهما متساوية.
في المثال أعلاه:
==قام بمقارنة المحتوى: هل عناصرlist_aتساوي عناصرlist_b؟ نعم، لذا النتيجةTrue.isقام بمقارنة الهوية: هلlist_aوlist_bهما نفس الكائن؟ لا، كل منهما كائن منفصل تم إنشاؤه، لذا النتيجةFalse.
🔬 كيف تعرف "هوية" الكائن؟ دالة id()
لكي نفهم is بشكل أعمق، يجب أن نعرف دالة id() المدمجة في بايثون. هذه الدالة تُرجع رقمًا فريدًا (هوية) يمثل عنوان الكائن في الذاكرة. إذا كان is يعطي True، فبالتأكيد دالة id() ستعطي نفس الرقم لكلا المتغيرين.
x = [10, 20, 30]
y = x # هنا، y يشير إلى نفس الكائن الذي يشير إليه x
z = [10, 20, 30] # هنا، z يشير إلى كائن جديد منفصل
print(id(x)) # سيظهر رقم (مثلاً: 140245...)
print(id(y)) # سيظهر نفس رقم x بالضبط
print(id(z)) # سيظهر رقم مختلف عن x و y
print(x is y) # True - لأنهما نفس الكائن
print(x is z) # False - لأنهما كائنان مختلفان
💡 متى نستخدم is بدلاً من ==؟
لا تستخدم is لمقارنة القيم العادية مثل الأرقام أو النصوص (في معظم الحالات). استخدامه الأساسي يكون مع:
-
القيمة
None: في بايثون،Noneيمثل عدم وجود قيمة. المقارنة الصحيحة معNoneتكون دائماً باستخدامisأوis not.my_var = None if my_var is None: print("المتغير لا يحتوي على قيمة!") # هذا صحيح if my_var is not None: print("المتغير يحتوي على قيمة.") -
القيم المنطقية (
True,False): يمكن استخدامisمعها، لكن==تعمل أيضاً بشكل صحيح.flag = True print(flag is True) # True print(flag is False) # False -
عندما تريد التأكد من أن متغيرين يشيران لنفس الكائن في الذاكرة، وليس فقط قيماً متشابهة.
🧪 أمثلة تطبيقية على مشغل is not
مشغل is not هو عكس is. يكون مفيداً للتحقق من أن كائنين مختلفين في الذاكرة.
# مثال مع القوائم
colors_1 = ["أحمر", "أخضر"]
colors_2 = ["أحمر", "أخضر"]
colors_3 = colors_1 # إشارة إلى نفس الكائن
print(colors_1 is not colors_2) # True - كائنان منفصلان
print(colors_1 is not colors_3) # False - هما نفس الكائن
# مثال عملي مع None
user_input = input("أدخل اسمك: ")
if user_input is not "": # أو if user_input != "":
print(f"مرحباً، {user_input}!")
else:
print("لم تدخل أي اسم.")
📝 ملخص الدرس
- مشغلات الهوية (
is,is not) تقارن هوية الكائنات في الذاكرة (هل هما نفس الشيء؟). - مشغلات المقارنة (
==,!=) تقارن قيم الكائنات (هل قيمتهما متساوية؟). - استخدم
isوis notبشكل أساسي معNone. - دالة
id()تساعدك على رؤية الهوية الفريدة لكل كائن. - تذكر: قيمتان متساويتان (
==True) لا تعني بالضرورة أنهما نفس الكائن (isTrue).
🎓 اختبر نفسك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال