
a = 7, b = a ואחר כך b = 9, שני המשתנים נשארים שונים, והערך של a נשאר 7.a = [1], b = a, ואז a.append(2) מוסיף את הערך גם ל-b, כי שניהם מצביעים לאותה רשימה.b = [], b מצביע לרשימה חדשה, ו-a נשאר עם התוכן שלו.id מראה אם שני משתנים מצביעים לאותו אובייקט.copy.copy יוצר עותק של השכבה העליונה בלבד.copy.deepcopy יוצר עותק עמוק של כל המבנה, כך שאין שיתוף של רשימות פנימיות.הטקסט המלא של הדקות הראשונות בהרצאה «Mutable - מבוא» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, בשיעור הזה נדבר על מיוטבל ואי-מיוטבל ופייתון והמשמעות שלהם בשפה. אז כמו בשפות תכנות אחרות, כמו Java ו-C-Sharp, יש מונח שנקרא מיוטבל ואי-מיוטבל של משתנה.
מיוטבל ואי-מיוטבל של משתנה, המשמעות היא איך פייתון, האם פייתון יוצר מחדש את המשתנה כל פעם שאנחנו קוראים לאופרטור שווה על המשתנה.
אני אסביר. למשל, בואו ניצור משתנה מסוג אינטג'ר, נקרא לו a, ו-a שווה ל-7. עכשיו ניצור את b, שהוא שווה ל-a גם כן.
כלומר, a שווה ל-7, ו-b גם שווה ל-7. מה יקרה אם נשנה את b, ונגיד שהוא שווה ל-9? האם גם a ישתנה? כבר לא. a ו-b הם כרגע שני משתנים שונים לגמרי.
עכשיו, זהו אולי דבר הגיוני וטבעי, אבל בואו ננסה אותו דבר על list ונראה מה קורה. בוא נגיד ש-list שווה a שווה ל-list שיש בו את הערך 1 ו-b גם שווה ל-a ו-b ועכשיו נעשה נוסיף משתנה ל-a כלומר נשנה את ה-list נעשה a.panned שזה הוספה לאיבר בליסט נוסיף לו את האיבר 2
עכשיו ב-a יש את 1 ו-2 ומה יש ב-b 1 ו-2 גם כן כלומר יש לנו פה התנהגות שונה על שתי סוגי משתנים שונים באינטג'ר ששינינו את b ואז a וb כבר לא שווים לאותו ערך.
לעומת זאת פה אנו רואים שa וb שווים לאותו דבר. בואו ננסה לעשות עכשיו עוד דבר. מה אם נעשה שb עכשיו שווה לליסט חדש? מה יקרה ל-a?
a עדיין מצביע על 1 ו-2 ו-b לעומת זאת כבר מצביע על ליסט חדש. כלומר כשעשינו b שווה ל אז בעצם מחקנו את כלומר b כבר לא מצביע על a אלא b עכשיו מצביע על מקום חדש בזיכרון שבו יש רשימה ריקה.
לעומת זאת כשעשינו append אז יצרנו שינינו העתק שגם a וגם b מצביעים עליו. מה קורה אבל אם אנחנו רוצים שa וb יהיו ליסטים שונים?
כלומר נגיד שa שווה לליסט שמכיל בטוחו את האיברים 1 ו-2 ואנו רוצים שגם b יהיה שווה לאותו דבר כמו a אבל אנחנו רוצים שאם נשנה את B אז A לא ישתנה, כלומר ליצור שתי משתנים שונים, כלומר ש-B יהיה לו את אותו תוכן של A אבל מעכשיו כל שינוי של B לא ישנה את A.
לעשות את זה יש שתי דרכים. דרך ראשונה זה להשתמש בפונקציית קופי. אפשר פשוט לעשות קופי נקודה קופי של A לתוך B. בעזרת הפונקציה ID אפשר לראות ששניהם מצביעים למקומות אחרים בזיכרון.
ואני גם אוכיח לכם את זה על ידי הוספת איבר ל-a, ותראו ש-b כבר לא משתנה. עוד דבר, עוד דרך שניתן להעתיק משתנה בליסט, זה על ידי שימוש ב-copy.deepcopy.
אנחנו נדבר על ההבדל בין deep ל-deepcopy בעוד רגע. דרך להעתיק היא בעזרת קיצור דרך של סוגריים שנכתב כך. שימו לב שה-id מראה את הכתובת בזיכרון של האיבר, ולפי זה שאנו רואים שהכתובת שונה, אנו מבינים שמדובר בהעתקה של הרשימה.
שים לב שאם נעשה העתקה פשוטה, ה-id שלהם יהיה