במקרים מסוימים נקבל את אותה התוצאה כשנשתמש ב is וב == אבל שתי האופציות קיימות ולא במקרה והן
לחלוטין לא זהות.
בואו נראה דוגמה שבהן התוצאה זהה:
כמו שאפשר לראות גם המשתנה a וגם המשתנה b נותנים לנו תוצאה זהה עם is ועם == .
כשבדקנו את הכתובת בזכרון, דרך השימוש בפונקציה id אפשר לראות ששני המשתנים מפנים לאותה כתובת בזכרון. הסיבה שפייתון מעדיפה במקרה הזה, מסיבות של יעילות, לבצע השמה של b לאותה כתובת בזכרון של a
הסיבה שבשני המקרים קיבלנו True קשורה לעובדה ש == בודק שהערכים זהים (ובמקרה הזה בשני המקרים הערך הוא המספר 1 = זהה) ואילו is בודק ששני האובייקטים מצביעים לאותה כתובת בזכרון, וזה הבדל משמעותי.
תראו את הדוגמה הבאה:
בדוגמה כאן הגדרנו שלושה משתנים, את a את b שהוא הפניה לאותו מקום בזכרון של a (ממש כמו בדוגמה הקודמת) ואת c שהוא כתובת אחרת בזכרון (ביצענו את זה על ידי כך שביצענו slice שלמעשה מייצר copy של המשתנה).
התוצאה היא ש is נותן לנו שהאובייקטים a ו b זהים, ואילו c שנמצא במקום אחר בזכרון (כפי שהרצה של id מראה לנו) אינו.
כמובן שערכי שלושת המשתנים זהים ולכן פעולת ההשוואה (==) מביאה לנו תוצאה זהה.
לסיכום:
- השימוש ב is הוא למעשה syntactic sugar:
a is b
הוא ממש כמו לכתוב:
id(a) == id(b)
- פייתון מבצעת אופטימיזציה של ביצועים כשמבצעים השמה של משנה אחד למשתנה שני על ידי הפניה לאותו מקום בזכרון.שימו לב, אין תמיד הבטחה שזה יהיה ככה אז כדאי להזהר עם ההנחה הזאת כדי להמנע מבאגים לא צפוים.
- השימוש ב slice מבצע העתקה של המשתנה לכתובת אחרת בזכרון - זו דרך נוחה מאוד להעתיק list בצורה בטוחה כשמעוניינים בכך.
- השימוש ב is הוא לבדיקה של identity - בדיקה ששני האובייקטים מפנים לאותה כתובת בזכררון, ואילו ב == נשתמש בכל שאר המקרים (כשנרצה לבצע השוואה של ערך של אובייקטים/משתנים).
בהמשך אכתוב מדריך מתקדם יותר שמתמתקד בהשוואה בין אובייקטים של מחלקה ודוגמאות קצת יותר מורכבות.