חיפוש אובייקט ברשימה

אם אני לוקח רשימה של אובייקטים list1, ומשכפל אותה ע"י הפקודה copy (או deepcopy לצורך העניין) לתוך list2, מדוע בחיפוש של
if x in list2
אני לא יכול למצוא את האובייקט? האם בהכרח הדרך היא רק ע"י השוואה של מאפיינים של האוביקט (כמו שם או משתנים אחרים שיש לעצם מהמחלקה).

באופן כללי, מתי כן ניתן בעת שכפול לחפש ישירות משהו בתוך רשימה, ומתי חייבים לעשות השוואה יותר מורכבת?

לייק 1

החיפוש ברשימה של אובייקטים מתרחש באופן הבא:
אנחנו עוברים על כל אחד מהאיברים לפי הסדר ובודקים האם הוא שווה לאיבר הנוכחי. אם כן מחזירים True ואחרת ממשיכים לאיבר הבא, ואם לאחר מעבר על כל הרשימה לא מצאנו את האיבר נחזיר False.
אז מה מוקד הבעיה? ההשוואה. ההשוואה נעשית ע"י המתודה החביבה __eq__ שמחזירה האם העצם שאתה מחפש שווה לעצם עליו אנו עוברים. אתה יכול להגדיר את הפונקציה הזו איך שאתה רוצה - שתחזיר תמיד True, שתחזיר תמיד False, שתשווה לפי מאפיין אחד או שתשווה לפי הרבה מאפיינים. אפשר לעשות עם זה הרבה דברים הגיוניים יותר או פחות.
ואם לא הגדרת את המתודה הזו? אז ההשוואה תהיה לפי הכתובת בזיכרון של האובייקט. כלומר, אם יש לך מחלקה A שאין בה שום דבר מרגש, למעט אולי פונקציית init חביבה, ואתה מבצע a = A() ואז מכניס את a לרשימה ובודק האם a בה - תקבל שכן. אבל אם למשל תצפה להכניס נקודה לרשימה ואז ליצור נקודה עם אותם ערכים ולקבל שהיא נמצאת ברשימה אתה צפוי מעט להתאכזב - עד שתגדיר את מתודת הקסם החביבה כך שתפעל כרצונך.

3 לייקים