تفاوت is و == در پایتون چیست؟

در این مقاله چه میخوانیم؟

مقدمه

حتماً برات پیش اومده که توی کدهای پایتونت از 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 استفاده می‌کنید، پایتون بررسی می‌کند که آیا دو متغیر به یک شیء یکسان در حافظه اشاره دارند یا نه. حتی اگر مقدار آن‌ها یکسان باشد، اگر در مکان‌های متفاوتی از حافظه ذخیره شده باشند، 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 و == چیست؟

در پایتون، == و 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) در پایتون

 

مثال از کش شدن مقادیر(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 و == در پایتون

  1. تفاوت اصلی بین is و == چیست؟
    == مقدار دو متغیر را مقایسه می‌کند، اما is بررسی می‌کند که آیا دو متغیر دقیقاً به یک شیء یکسان در حافظه اشاره دارند یا نه.

  2. آیا is و == همیشه نتایج یکسانی دارند؟
    خیر، ممکن است دو متغیر مقدار یکسانی داشته باشند (==True) اما در حافظه به اشیای متفاوتی اشاره کنند (isFalse).

  3. آیا برای مقایسه None باید از is استفاده کرد؟
    بله، بهترین روش برای بررسی None استفاده از is است، زیرا None همیشه یک شیء یکتا در حافظه است.

  4. چرا مقایسه بعضی اعداد و رشته‌ها با is مقدار True می‌دهد؟
    پایتون برای بهینه‌سازی حافظه، برخی اعداد کوچک ( تا ۲۵۶) و رشته‌های کوتاه را کش می‌کند، بنابراین متغیرهای دارای این مقادیر ممکن است به یک شیء یکسان اشاره کنند.

  5. چه زمانی نباید از is استفاده کرد؟
    زمانی که قصد مقایسه مقدار متغیرها را دارید (مثلاً در لیست‌ها، دیکشنری‌ها و داده‌های ورودی کاربر)، بهتر است از == استفاده کنید.

 

جمع بندی

در نهایت، is و == هرکدام کاربرد خاص خود را دارند و استفاده نادرست از آن‌ها می‌تواند منجر به نتایج غیرمنتظره شود. اگر می‌خواهید مقدار دو متغیر را مقایسه کنید، از == استفاده کنید. اما اگر قصد دارید بررسی کنید که آیا دو متغیر دقیقاً به یک شیء در حافظه اشاره دارند، is گزینه مناسب‌تری است.
همچنین، برای مقایسه None، True و False، همیشه is را انتخاب کنید تا کد شما خواناتر و استانداردتر باشد.

شما تا حالا تجربه‌ای از استفاده اشتباه is و == داشتید؟ نظرتون رو در کامنت‌ها بنویسید! 😃
همچنین برای ایدگیری اصولی و حرفه ای زبان برنامه نویسی پایتون به صفحه آموزش زبان پایتون در آکادمی برنامه نویسی استاد محسن مدحج مراجعه کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *