خذ بالك عند مقارنة الأرقام في بايثون

السلام عليكم و رحمة الله
ملاحظة غريبة عند مساواة رقمين في بايثون
لنفترض

b = 256

عند إختبار

a is b

فالمتوقع أن يكون الناتج true
لكن جرب

c = 257
d = 257

عند إختبار

c is d

ستجد أن الناتج false
إليك التفسير:
في الحقيقة الحالة الثانية هي الأساس حيث أن is في بايثون تقارن كينونة العنصر نفسه و ليس قيمته
In Python, is tests for identity, not equality.
و على هذا فإن c كائن مستقل و d كائن مستقل أخر و لذلك c is not d.
لكن لماذا في الحالة الأولى عند مقارنة a و b تساوى الكائنين !!!
ذلك لأن مع بايثون الأعداد من -5 و حتى 256 مخزنة في الذاكرة “و ذلك لأسباب متعلقة بالأداء” و لذلك عندما أعطيت a و b قيمة داخل هذا النطاق من الأعداد (في حالتنا هذه 256) أصبح للكائنين نفس المرجع لنفس القيمة في الذاكرة مما

أعطانا True عند المقارنة بينهما ب is.

الدرس المستفاد: لتقارن بين قيمتين لكائنين إستخدم == أفضل.

*هذه الملاحظة مرتبطة ب CPython و صاحب المقال الأصلي جربها مع بايثون 3 و أنا جربتها مع بايثون 2.6 و أعطت نفس النتيجة.
*عندما قمت بتجربتها مع Jython فكانت النتيجة True في نطاق الأعداد من -101 حتى 899.
*هل من أحد يجربها مع ironPython ؟

المقال الأصلي:
http://distilledb.com/blog/archives/date/2009/06/18/python-gotcha-integer-equality.page

One thought on “خذ بالك عند مقارنة الأرقام في بايثون

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s