העתקת סטרינג ל-id שונה

בשבוע 4 במחברת builtins יש דוגמא עם העתקת סטרינג משהו כזה:
a = “hi”
b = a[:]
ואז יש להם שני id שונים.

כשאני מנסה במחברת שלי לעשות את זה - אני עדיין מקבלת את אותו id לשניהם.
לעומת זאת, אם אני עושה:
b = a[:-1[
זה כן עובד, אני מקבלת שני id שונים.
יש לכם מושג למה?

קודם כל שימי לב שבמקרה השני את משנה את b - עכשיו הוא רק “h” כי הורדת ממנו את התו האחרון.
בנוסף לדעתי ים הזכיר את זה איפשהו אבל אני כבר לא זוכרת איפה.
בגדול: בגלל שמחרוזות הן immutable, פייתון מרשה לעצמו לחסוך מקום בזיכרון ואם יש לך שתי מחרוזות זהות עד מספר כלשהו של תווים (כבר לא זוכרת כמה, אבל בדקתי פעם ודי גדול) הוא לא יוצר אותן מחדש אלא דואג ששתיהן יצביעו לאותו מקום (הוא עושה את זה בעוד מקרים).
למה זה טוב? כי אין סיבה שלא. אי אפשר לשנות מחרוזת, ולכן גם אם תרצי לבצע משהו כמו a = a + “r” למשל זה ישנה לך את ההצבעה של a אבל לא את המחרוזת “hi” - אותה לא ניתן לשנות. לכן אין סיבה לא לחסוך במקום למחשב, ופייתון עושה אופטימיזציה עד שלב מסוים.
למעשה פייתון אפילו עוד יותר חכם (או חכמה כי זו שפה? אני צריכה לבדוק את העניין), וגם אם תבצעי את ההשמה a = “hi” ושורה לאחר מכן b = “hi” הוא עדיין יידע שהמחרוזת קיימת לו בזיכרון וה-id של a ושל b יהיה זהה!

לייק 1

תודה על התגובה!
אבל זה די מבלבל אותי, כי ים אמר שלא מנומס לשנות סטרינג שקיבלנו בפונקציה כפרמטר.

איני זוכרת מתי הוא אמר את זה על מחרוזת ולא על רשימה - אשמח אם תרענני את זכרוני - אולי ההקשר יסייע :slight_smile:

בזמנו כשאני תהיתי על זה אחי שלח לי את הקישור הזה https://medium.com/@bdov_/https-medium-com-bdov-python-objects-part-iii-string-interning-625d3c7319de, אולי הוא יסייע גם כן :slight_smile:

לייק 1

אמרתי מזיכרון, אולי את באמת צודקת!