مقدمه
حتماً برات پیش اومده که توی کدهای پایتونت از is و == استفاده کنی و انتظار یه نتیجه مشخص رو داشته باشی، ولی یه خروجی عجیب و غیرمنتظره بگیری! 🤯 مثلاً دو لیست دقیقاً شبیه هم هستن، اما وقتی با is مقایسهشون میکنی، میگه که برابر نیستن! پس تفاوت is و == در پایتون چیه؟ چرا گاهی این دوتا رفتار متفاوتی دارن؟
اینجاست که باید بدونیم is و == دو دنیای متفاوت دارن: ✅ == مقدار رو بررسی میکنه و میپرسه: “آیا این دو مقدار برابر هستن؟” ✅ is چک میکنه که آیا هر دو متغیر دقیقاً به یک جای حافظه اشاره میکنن یا نه؟
اما چرا این موضوع مهمه؟ چون اگه تفاوت این دوتا رو ندونی، ممکنه برنامهت بهخاطر یه مقایسه اشتباه، یه رفتار عجیب داشته باشه و کلی زمان برای دیباگ کردن هدر بدی! 😩
توی این مقاله قراره خیلی ساده و شفاف، با مثالهای واقعی و کاربردی، تفاوت این دو رو توضیح بدیم. پس اگه میخوای از این اشتباهات جلوگیری کنی و حرفهایتر کد بزنی، با ما همراه باش! 🚀🔥

در پایتون، عملگر == برای مقایسه مقدار دو متغیر استفاده میشود. این عملگر بررسی میکند که آیا مقادیر دو متغیر برابر هستند یا نه، بدون در نظر گرفتن محل ذخیرهسازی آنها در حافظه.
(==) مقدار را مقایسه میکند، نه مکان حافظه!
هنگامی که از == استفاده میکنید، پایتون فقط مقدار دو متغیر را بررسی میکند. حتی اگر این متغیرها در مکانهای متفاوتی از حافظه ذخیره شده باشند، اگر مقدارشان یکسان باشد، == مقدار True را برمیگرداند.
مثال:
a = [1, 2, 3] b = [1, 2, 3] print(a == b) # خروجی: True
در این مثال، مقدار a و b برابر است، بنابراین == مقدار True را بازمیگرداند، حتی اگر این دو لیست در مکانهای متفاوتی از حافظه ذخیره شده باشند.
مثالهایی از == در پایتون
عملگر == میتواند برای مقایسه انواع مختلف دادهها در پایتون استفاده شود، از جمله لیستها، اعداد، رشتهها و دیکشنریها.
📌 مقایسه اعداد:
x = 10 y = 10 print(x == y) # خروجی: True
📌 مقایسه رشتهها:
str1 = "Hello" str2 = "Hello" print(str1 == str2) # خروجی: True
📌 مقایسه دیکشنریها:
dict1 = {"name": "Ali", "age": 25}
dict2 = {"name": "Ali", "age": 25}
print(dict1 == dict2) # خروجی: True
در تمام این مثالها، مقادیر دو متغیر برابر هستند، پس == مقدار True را بازمیگرداند.
آیا همیشه == انتخاب درستی است؟
در بسیاری از موارد، == برای مقایسه مقدار کافی است، اما گاهی نیاز داریم بررسی کنیم که آیا دو متغیر دقیقاً به یک شیء یکسان در حافظه اشاره دارند یا نه. در چنین مواقعی == کافی نیست و باید از روشی دیگر استفاده کنیم که در ادامه به آن خواهیم پرداخت. 😉

is در پایتون چیست و چه کاری انجام میدهد؟
در پایتون، عملگر is برای بررسی این که دو متغیر به یک شیء یکسان در حافظه اشاره دارند یا نه استفاده میشود. برخلاف == که فقط مقدار را مقایسه میکند، is بررسی میکند که آیا دو متغیر دقیقاً یک شیء یکسان هستند.
is مکان حافظه را مقایسه میکند، نه مقدار را!
وقتی از is استفاده میکنید، پایتون بررسی میکند که آیا دو متغیر به یک شیء یکسان در حافظه اشاره دارند یا نه. حتی اگر مقدار آنها یکسان باشد، اگر در مکانهای متفاوتی از حافظه ذخیره شده باشند، is مقدار False را برمیگرداند.
مثال:
a = [1, 2, 3] b = [1, 2, 3] print(a is b) # خروجی: False
در این مثال، هرچند مقدار a و b برابر است، اما این دو لیست دو شیء مجزا در حافظه هستند، پس is مقدار False را برمیگرداند.
عملگر is معمولاً برای بررسی این که دو متغیر به یک شیء یکسان اشاره دارند یا نه استفاده میشود. در برخی موارد، بهویژه هنگام کار با متغیرهای عددی کوچک، رشتهها و None، پایتون ممکن است بهینهسازی داخلی انجام دهد و متغیرها را به یک شیء یکسان در حافظه ارجاع دهد.
مثالهایی از is در پایتون
📌 بررسی اشیاء یکسان در حافظه:
x = 10 y = 10 print(x is y) # خروجی: True
در اینجا، پایتون مقدار ۱۰ را در یک بخش از حافظه ذخیره کرده و هر دو متغیر x و y را به همان بخش ارجاع داده است. بنابراین is مقدار True را برمیگرداند.
📌 بررسی رشتهها (بهینهسازی حافظه پایتون):
str1 = "hello" str2 = "hello" print(str1 is str2) # خروجی: True
پایتون برای رشتههای کوتاه و بدون فاصله، بهینهسازی حافظه انجام میدهد و آنها را در یک مکان مشترک ذخیره میکند. به همین دلیل str1 is str2 مقدار True را برمیگرداند.
📌 بررسی None:
x = None y = None print(x is y) # خروجی: True
در پایتون، None همیشه یک شیء واحد است، بنابراین تمام متغیرهایی که مقدار None دارند، به همان شیء در حافظه اشاره میکنند.
آیا همیشه is انتخاب درستی است؟
عملگر is برای بررسی هویت اشیاء در حافظه استفاده میشود، نه مقدار آنها. در برخی مواقع، ممکن است استفاده از is نتیجهای غیرمنتظره ایجاد کند، بهخصوص هنگام کار با انواع دادههای تغییرپذیر مانند لیستها و دیکشنریها. بنابراین باید بدانید که چه زمانی از is و چه زمانی از == استفاده کنید. در ادامه، این دو عملگر را با هم مقایسه خواهیم کرد. 🚀

تفاوت کلیدی بین is و == چیست؟
در پایتون، == و is هر دو برای مقایسه استفاده میشوند، اما تفاوت اساسی بین آنها این است که:
==مقدار را مقایسه میکند. یعنی اگر دو متغیر مقدار یکسانی داشته باشند، نتیجهTrueخواهد بود، حتی اگر در مکانهای متفاوتی از حافظه ذخیره شده باشند.isهویت اشیاء را در حافظه بررسی میکند. یعنی اگر دو متغیر دقیقاً به یک شیء یکسان در حافظه اشاره کنند، مقدارTrueبرمیگرداند.
برای درک بهتر، جدول زیر تفاوتهای کلیدی بین == و is را نشان میدهد:
جدول مقایسه is و ==
| ویژگی | == (مقایسه مقدار) |
is (مقایسه هویت) |
| بررسی مقدار | ✅ بله | ❌ خیر |
| بررسی آدرس حافظه | ❌ خیر | ✅ بله |
| استفاده در مقایسه لیستها و دیکشنریها | ✅ بله | ❌ خیر |
استفاده در مقایسه None, True, False |
❌ توصیه نمیشود | ✅ توصیه میشود |
آیا همیشه باید از == یا is استفاده کرد؟
انتخاب بین == و is بستگی به نیاز شما دارد:
- اگر میخواهید بررسی کنید دو متغیر مقدار یکسانی دارند یا نه → از
==استفاده کنید. - اگر میخواهید بدانید دو متغیر دقیقاً یک شیء یکسان در حافظه هستند یا نه → از
isاستفاده کنید.
در ادامه، چند مثال عملی از این تفاوت را بررسی خواهیم کرد. 🚀
اشتباه رایج در استفاده از is
یکی از خطاهای رایج هنگام استفاده از is در پایتون، نتایج غیرمنتظره در مقایسه مقادیر کوچک است. گاهی اوقات ممکن است دو مقدار یکسان باشند و is مقدار True برگرداند، درحالیکه در موارد دیگر مقدار False را ببینید. دلیل این اتفاق، کش شدن مقادیر در پایتون است.
چرا is گاهی خروجی غیرمنتظره میدهد؟
پایتون برای بهینهسازی حافظه، مقادیر عددی کوچک (مانند اعداد بین -۵ تا ۲۵۶) و برخی رشتههای کوتاه را در یک فضای مشترک ذخیره میکند. به این فرآیند کش شدن (caching) گفته میشود.
- وقتی دو متغیر مقدار یکسانی دارند و در این محدوده باشند، پایتون آنها را به یک شیء یکسان در حافظه اشاره میدهد، پس
isمقدارTrueرا برمیگرداند. - اما خارج از این محدوده، پایتون دو شیء جداگانه ایجاد میکند، در نتیجه
isمقدارFalseبرمیگرداند.

مثال از کش شدن مقادیر(caching) در پایتون
📌 اعداد در بازه -۵ تا ۲۵۶ کش میشوند:
a = 256 b = 256 print(a is b) # خروجی: True
پایتون مقدار ۲۵۶ را کش کرده و هر دو متغیر a و b را به همان شیء در حافظه ارجاع داده است، بنابراین is مقدار True را برمیگرداند.
📌 اعداد بزرگتر از ۲۵۶ کش نمیشوند:
a = 257 b = 257 print(a is b) # خروجی: False
چون ۲۵۷ خارج از محدوده کش پایتون است، برای a و b دو شیء جداگانه در حافظه ساخته شده و is مقدار False را برمیگرداند.
آیا فقط برای اعداد این اتفاق میافتد؟
خیر! رشتههای کوتاه و برخی اشیای دیگر نیز ممکن است کش شوند. در ادامه، این موضوع را بررسی خواهیم کرد. 🚀
کجا از is استفاده کنیم؟
در این بخش، کاربردهای مناسب عملگر is را در شرایطی که نیاز به بررسی هویت شیء (نه صرفاً مقدار) داریم، بررسی میکنیم. به عبارت دیگر، اینجا توضیح داده میشود که چرا و در چه شرایطی استفاده از is نسبت به == ترجیح داده میشود.
مقایسه با None (بهترین کاربرد is)
از آنجا که None در پایتون یک شیء یکتا است، بهترین روش برای بررسی اینکه آیا یک متغیر مقدار None دارد یا نه، استفاده از is است. این روش به صورت دقیق از هویت شیء استفاده کرده و از بروز خطاهای احتمالی جلوگیری میکند.
x = None
if x is None:
print("متغیر مقدار None دارد")
مقایسه True و False با is
از آنجا که None در پایتون یک شیء یکتا است، بهترین روش برای بررسی اینکه آیا یک متغیر مقدار None دارد یا نه، استفاده از is است. این روش به صورت دقیق از هویت شیء استفاده کرده و از بروز خطاهای احتمالی جلوگیری میکند.
flag = True
if flag is True:
print("شرط برقرار است!")

سوالات متداول is و == در پایتون
- تفاوت اصلی بین
isو==چیست؟==مقدار دو متغیر را مقایسه میکند، اماisبررسی میکند که آیا دو متغیر دقیقاً به یک شیء یکسان در حافظه اشاره دارند یا نه. - آیا
isو==همیشه نتایج یکسانی دارند؟
خیر، ممکن است دو متغیر مقدار یکسانی داشته باشند (==→True) اما در حافظه به اشیای متفاوتی اشاره کنند (is→False). - آیا برای مقایسه
Noneباید ازisاستفاده کرد؟
بله، بهترین روش برای بررسیNoneاستفاده ازisاست، زیراNoneهمیشه یک شیء یکتا در حافظه است. - چرا مقایسه بعضی اعداد و رشتهها با
isمقدارTrueمیدهد؟
پایتون برای بهینهسازی حافظه، برخی اعداد کوچک (-۵تا۲۵۶) و رشتههای کوتاه را کش میکند، بنابراین متغیرهای دارای این مقادیر ممکن است به یک شیء یکسان اشاره کنند. - چه زمانی نباید از
isاستفاده کرد؟
زمانی که قصد مقایسه مقدار متغیرها را دارید (مثلاً در لیستها، دیکشنریها و دادههای ورودی کاربر)، بهتر است از==استفاده کنید.
جمع بندی
در نهایت، is و == هرکدام کاربرد خاص خود را دارند و استفاده نادرست از آنها میتواند منجر به نتایج غیرمنتظره شود. اگر میخواهید مقدار دو متغیر را مقایسه کنید، از == استفاده کنید. اما اگر قصد دارید بررسی کنید که آیا دو متغیر دقیقاً به یک شیء در حافظه اشاره دارند، is گزینه مناسبتری است.
همچنین، برای مقایسه None، True و False، همیشه is را انتخاب کنید تا کد شما خواناتر و استانداردتر باشد.
شما تا حالا تجربهای از استفاده اشتباه is و == داشتید؟ نظرتون رو در کامنتها بنویسید! 😃
همچنین برای ایدگیری اصولی و حرفه ای زبان برنامه نویسی پایتون به صفحه آموزش زبان پایتون در آکادمی برنامه نویسی استاد محسن مدحج مراجعه کنید.