تفاوت == و is در Python؛ اشتباهی که ممکن است در تست پنهان بماند

چرا مهم است

اگر برای مقایسهٔ مقدارها از is استفاده کنی، رفتار cache در CPython ممکن است اشتباهت را در تست کوچک پنهان کند. دانستن این تفاوت کمک می‌کند بفهمی چرا همان مقایسه ممکن است بعداً نتیجهٔ دیگری بدهد.

قبل از خواندن، این‌ها را بدان۳ مفهوم
cache

روشی برای نگه‌داشتن داده یا نتیجه و استفادهٔ دوباره از آن؛ در مثال این مطلب، CPython برخی مقدارهای کوچک را نگه می‌دارد و دوباره استفاده می‌کند.

بیشتر درباره این مفهوم

Object Identity

مشخص می‌کند که دو ارجاع به همان object در حافظه اشاره می‌کنند یا نه؛ این موضوع با برابر بودن مقدار دو object متفاوت است.

در حال نگارش

CPython

یکی از پیاده‌سازی‌های Python که برای اجرای برنامه‌های این زبان به کار می‌رود.

در حال نگارش

در Python،؜ دو عملگر == و is پرسش یکسانی نمی‌پرسند. == بررسی می‌کند که آیا دو object مقدار یکسانی دارند؛ اما is برای بررسی Object Identity است: آیا هر دو واقعاً همان object در حافظه هستند؟

برای مثال، اگر a و b هرکدام جداگانه با مقدار [1, 2, 3] ساخته شوند، نتیجهٔ a == b برابر True است، چون مقدارشان یکسان است. در مقابل، a is b برابر False می‌شود، چون دو object جدا هستند. پس برابر بودن مقدار، به معنی یکی بودن خود object نیست.

نکته‌ای که ممکن است تازه‌کارها را گمراه کند، رفتار CPython است. این پیاده‌سازی Python برای عددهای صحیح کوچک و string‌های کوتاه از cache استفاده می‌کند. در نتیجه، مقایسه با is ممکن است در یک تست کوچک همان نتیجه‌ای را بدهد که از مقایسهٔ مقدار انتظار می‌رود. همین موضوع می‌تواند اشتباه را پنهان کند و باعث شود کدی که در تست کار می‌کند، بعداً در محیط عملیاتی به مشکل بخورد.

قاعدهٔ پیشنهادی مطلب روشن است: برای مقایسهٔ مقدارها از == استفاده کن. is را برای None،؜ True و False نگه دار، نه برای مقایسهٔ مقدار عددها یا متن. موفقیت یک تست کوچک، دلیل درستی استفاده از is به‌جای == نیست.

نکته کلیدی

قبل از نوشتن مقایسه، مشخص کن دنبال برابری مقدار هستی یا یکی بودن خود object. برای مقدار عدد و متن از == استفاده کن؛ طبق قاعدهٔ این مطلب، is را برای None،؜ True و False نگه دار.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۴)