Python פונקציית id() מחזירה את "הזהות" של האובייקט. הזהות של אובייקט היא מספר שלם, שהוא מובטח להיות ייחודי וקבוע עבור האובייקט במהלך חייו. שני אובייקטים עם מחזורי חיים שאינם מתקנים יכולים להכיל את אותו ערך id(). במימוש CPython, זהו כתובת האובייקט בזיכרון.
פונקציית id() ב-Python
Python מזין למטמון את ערך id() של סוגי נתונים נפוצים, כמו מחרוזת, מספר שלם, טאפלים וכדומה. לכן, ייתכן שתמצא כי משתנים מרבית מצביעים על אותו אובייקט ויש להם ערך id() זהה אם הערכים שלהם זהים. בוא נבדוק זאת בדוגמה.
# מספרים שלמים
a = 10
b = 10
c = 11
d = 12
print(id(a))
print(id(b))
print(id(c))
print(id(d))
פלט:
4317900064
4317900064
4317900096
4317900128
שים לב שערך ה-id() של 'a' ו-'b' זהה, ויש להם את אותו ערך של מספר שלם. בוא נראה אם נקבל את ההתנהגות הדומה גם עם מחרוזת וטאפלים?
# tuples
t = ('A', 'B')
print(id(t))
t1 = ('A', 'B')
print(id(t1))
# strings
s1 = 'ABC'
s2 = 'ABC'
print(id(s1))
print(id(s2))
פלט:
4320130056
4320130056
4320080816
4320080816
מהפלט, ניתן לראות ש-Python מזין למטמון את מחרוזות ואובייקטים של טאפלים ומשתמש בהם כדי לחסוך מקום בזיכרון.
מטמון יכול לעבוד רק עם אובייקטים בלתי שנים להם, שים לב שמספרים שלמים, מחרוזות וטאפלים הם בלתי שנים. לכן, מימוש Python יכול להשתמש במטמון כדי לחסוך מקום בזיכרון ולשפר את הביצועים.
אנו יודעים שהמילון אינו ללא שינוי, בואו נראה אם id() הוא שונה למילונים שונים גם אם האיברים זהים?
# dict
d1 = {"A": 1, "B": 2}
d2 = {"A": 1, "B": 2}
print(id(d1))
print(id(d2))
פלט:
4519884624
4519884768
כפי שחשבנו, אובייקטים מסוג dict מחזירים ערך id() שונה ונראה שאין כאן שמירת מטמון.
Python id() עבור אובייקט מותאם אישית
בואו נראה דוגמה פשוטה לקבלת ערך id() עבור אובייקט מותאם אישית.
class Emp:
a = 0
e1 = Emp()
e2 = Emp()
print(id(e1))
print(id(e2))
פלט:
4520251744
4520251856
סיכום
ערך id() ב-Python מובטח להיות ייחודי וקבוע עבור אובייקט. אנו יכולים להשתמש בזה כדי לוודא ששני אובייקטים מפנים לאותו אובייקט בזיכרון או לא.
ניתן לבדוק את סקריפט הפייתון המלא ודוגמאות פייתון נוספות במאגר הקוד שלנו ב-GitHub.
הפנייה: תיעוד רשמי
Source:
https://www.digitalocean.com/community/tutorials/python-id