دست نوشته هام...

دست نوشته های شخصی من، در مورد همه چیز....

دست نوشته هام...

دست نوشته های شخصی من، در مورد همه چیز....

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

چهارشنبه, ۸ دی ۱۳۹۵، ۰۲:۲۸ ب.ظ

سلام...

تا حالا فک کردین که "is" و "==" با هم چه تفاوتی دارن توی پایتون؟ توی این مطلب کوتاه، خیلی سریع این مبحث رو بررسی می‌کنیم!

کاری که میخوام بکنم اینه که یه مدت بشینم توی وبلاگم از این نکات ریز پایتونی بذارم، و شما هم می‌تونید در اینده در صورت علاقه اونها رو با دنبال کردن تگ #پایتون توی وبلاگم پیدا کنین و بخونین! :)

یه دوقولو(دو تا ادم که کپی پیست هم هستن!) رو در نظر بگیرید. اونها قیافه‌های کاملا شبیه به هم دارن رنگ چشم، قد، وزن، سن و همه‌چیزشون مثل همه. هیچ تفاوتی ندارن، با این حال، ما می‌دونیم که اینها دونفر ادم متفاوت از هم‌دیگر هستند. دو شخصیت جدا با ویژگی های مربوط به خودشون، اما کاملا شبیه به هم.

توی پایتون هم داستان از همین قرار هست. فرض کنید یک لیست دارید با محتوای زیر:

x = [1, 2, 3]

 خوب، ما یه لیست داریم به اسم x. حالا بیاید اون رو برابر با y بکنیم.

y = x

به نظرتون این‌دوتا یکی هستن؟

منظورم این هستش که اگر از پایتون بخوایم که نتیجه x==y رو بهمون بگه، نتیجه چی هست؟

x == y

> True

امیدوارم جوابی که گرفتیم، همون چیزی باشه که شما هم فکر میکردین!! پس حالا بیاین یه چیز دیگه رو تست کنیم

y is x

> True

 خوب، هنوز هم امیدوارم که این جواب هم، همون چیزی باشه که شما هم فکر میکردین...

اگر پیش‌زمینه برنامه‌نویس سی‌پلاس داشته باشید، بهتون در مورد اشاره گر‌ها می‌گفتم! ولی اینجا مجبورم در نظر بگیرم که شما لزوما اشاره‌گرها رو بلد ندارید، و بنابراین براتون ساده توضیح میدم...
توی حافظه، ما یه لیست داریم شامل اعداد 1, 2, 3 و حالا یه بار با x و یه بار با y بهش اشاره کردیم. بنابراین اگر بنویسیم:

x.append(4)

x

> [1, 2, 3, 4]

y

> [1, 2, 3, 4]

y.append(5)

y

> [1, 2, 3, 4, 5]

x

> [1, 2, 3, 4, 5]

می‌بینید که ما با دوتا لیست مختلف سر و کار نداریم. اگر هر کدوم رو دستکاری بکنیم، لیست دیگری هم تغییر میکنه و نهایتا، می فهیم که فقط یه لیست داریم که با دو متغییر مختلف صداش می‌زنیم یا باهاش کار میکنیم!!

حالا بیاید یه کار جدید بکنیم:

z = list(x)

z

> [1, 2, 3, 4, 5]

خوب، ما یه دونه متغییر دیگه درست کردیم. خروجی z کاملا شبیه به x و y هستش مگه نه؟ اما ایا الان هم این متغییر‌ها، با هم برابر‌ هستن؟

x == z

> True

می‌دونید؛ من همچنان امیدوار هستم که شما نتایج رو همینجوری درست پیش‌بینی کرده باشید...

به نظرتون خروجی is در اینجا چی هست؟

x is z

> False

...

چی شد؟

بذارید کار قبلی رو انجام بدیم:

x.remove(5)

x

> [1, 2, 3, 4]

y

> [1, 2, 3, 4]

z

> [1, 2, 3, 4, 5]

چی شد؟ z با اینکه مقدارش برابر بود با x , y، اما به یک لیست اشاره نمی‌کردن. بنابراین در حال حاضر ما دو تا لیست داریم. لیست اول که دو متغییر x , y بهش اشاره میکنن و لیست دوم که z داره بهش اشاره می‌کنه.

حالا، عملگر == بررسی می‌کنه که ایا مقادیر(ظاهر) دوتا متغییر مثل هم هست یا نه؟ بنابراین کاری نداره که اینها دو لیست متفاوت هستن یا یک لیست هست.

در مقابل،  is داره یکسان بودن رو بررسی می‌کنه. ایا متغییر چپ، داره به همون چیزی اشاره میکنه که سمت راستی؟بنابراین یکسان بودن در is بررسی میشه. بنابراین حتی اگر مقادیرشون یکسان باشه، چون داریم به یه لیست دیگه اشاره می‌کنیم، برای این عملگر کافی هست تا اعلام بکنه این‌دو متغییر مورد بررسی یکسان نیستند.

امیدوارم که فهمیده باشید تفاوت is و == چی هست و کجا باید از کدوم استفاده بشه.

  • چهارشنبه, ۸ دی ۱۳۹۵، ۰۲:۲۸ ب.ظ
  • Senaps

نظرات  (۳)

ممنون از توضیحات خوبتون
مرجع شی = متغییر
شی == مقدار درون متغییر
در واقع این مطلب اینو میگه
== اشاره به این داره که شی درون هر دو مرجع شی یکسان و یکی هستن.(شی را مقایسه میکند)
is اشاره داره که خود مرجع شی یکسان هستن.(مرجع شی را مقایسه میکند)
[1, 2] = a
[1, 2] = b
a == b >> True
a is b >> False
...........................
[1, 2] = a = b
a == b >> True
a is b >> True
چرا اینا که گفتی فقط روی لیست هست روی دیتا های دیگه اینجوری نیست !؟
پاسخ:
خیر من مثال رو برای لیست زدم، روی تمام المان‌ها کار می‌کنه.
سلام و خسته نباشید اما به این مثال توجه کنید:

x = 1
y = x
y == x
True <<<
x is y
True <<<
(z = int(x
x == z
True <<<
x is z
True <<<



در موارد بالا با وجود اینکه به یک شی اشاره نمیکنند و هویت هر کدوم متفاوت است.
در واقع is مقدار id() اون دو شی رو بررسی میکنه ولی == مقدار value اون شی رو بررسی میکنه.
البته دلیل اینکه چرا id دو متغیر مختلف اینتیجر(با value برابر) با هم برابر هست ولی دو متغیر list اینطور نیست رو دقیق نمیدونم.
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
تجدید کد امنیتی