ویدیو تفاوت بین is و == در پایتون
برای مقایسه آبجکت ها در پایتون میتوان از دو عملگر == و is استفاده کرد. تفاوت ظریفی بین این دو عملگر وجود دارد. ممکن است شنیده باشید که عملگر is از == سرعت بیشتری دارد. یا حس کنید که is پایتونیتر است.اما باید به یاد داشته باشید که این دو عملگر در ظاهر به یک شکل کار میکنند اما در باطن تفاوت بزرگی دارند.
عملگر == برابری دو آبجکت را بررسی میکند اما عملگر is بررسی میکند که دو آبجکت به یک مقدار در حافظه اشاره کنند.
# مقایسه آبجکتها با is و is not در پایتون
عملگرهای is و is not هویت دو آبجکت را مقایسه میکنند. در CPython این به معنی آدرس حافظه آنها است. هر چیزی در پایتون یک آبجکت است و هر آبجکتی در حافظه مموری ذخیره میشود. دو عملگر is و is not بررسی میکنند که آیا دو آبجکت به یک آدرس در حافظه اشاره میکنند یا خیر.
شما میتوانید از متد ()id استفاده کنید و هویت یک آبجکت را بررسی کنید:
>>> help(id)
Help on built-in function id in module builtins:
id(obj, /)
Return the identity of an object.
This is guaranteed to be unique among simultaneously existing objects.
(CPython uses the object's memory address.)
>>> id(id)
2570892442576
خط آخر نشان میدهد که خود متد ()id نیز در حافظه ذخیره شده و آدرس آن را نشان میدهد. کد پایین را در نظر بگیرید:
a = [1, 2, 3]
b = a
print(id(a))
print(id(b))
print(a is b)
# OUTPUT
140702576814912
140702576814912
True
در کد بالا یک لیست به نام a ساختهایم که مقادیر 1, 2, 3 را در خود ذخیره میکند. در خط بعد متغیر a را در متغیر b ذخیره میکنیم. بعد از گرفتن id هر دو این متغیرها، میبینید که عدد یکسانی را نشان میدهند. این اعداد یکسان نشان میدهند که هر دو متغیر a و b در یک مکان از حافظه ذخیره شدهاند. پس پاسخ عملگر is برابر با True خواهد بود.
حالا کد را تغییر میدهیم:
a = [1, 2, 3]
b = [1, 2, 3]
print(id(a))
print(id(b))
print(a is b)
# OUTPUT
139943112022848
139943112068224
False
در این کد متغیرهای a و b هر دو یک لیست با مقادیر 1, 2, 3 دارند. در این حالت id دو عدد متفاوت نمایش خواهد داد. چون متغیرهای a و b در یک مکان از حافظه ذخیره نمیشوند، پس عملگر is نتیجه False را نمایش میدهد. درست است که محتوای متغیرهای a و b یکسان هستند اما آدرس حافظه آنها متفاوت است.
# مقایسه آبجکتها با == و =! در پایتون
عملگرهای == و =! برخلاف دو عملگر قبلی، کاری با آدرس حافظه ندارند و فقط محتویات را بررسی میکنند.
به کد زیر دقت کنید:
a = [1, 2, 3]
b = a
print(id(a))
print(id(b))
print(a == b)
# OUTPUT
140199362054976
140199362054976
True
در کد بالا میبیند که محتویات و آدرس حافظه هر دو متغیر a و b یکسان است. پس عملگر == نتیجه True را نمایش میدهد. کد بالا را تغییر میدهیم تا آدرس حافظه تغییر کند:
a = [1, 2, 3]
b = [1, 2, 3]
print(id(a))
print(id(b))
print(a == b)
# OUTPUT
140533901888320
140533901933696
True
در کد بالا آدرس حافظه تغییر کرده اما از آنجایی که محتویات دو متغیر یکسان است، عملگر == هنوز هم True برمیگرداند.
اگر ویدیو بالا را دوست داشتید پیشنهاد میکنیم به مطالب زیر هم سر بزنید:
دوره های آموزش پروژه محور و پیشرفته پایتون
ارسال نظر