
l2 = l, שני השמות מצביעים על אותה רשימה, ושינוי דרך אחד מהם נראה גם בשני. לעומת זאת, השמה מחדש של מספר או מחרוזת יוצרת אובייקט חדש, והשם השני לא משתנה.copy, או בקיצור עם סוגריים מרובעים. הפונקציה id מציגה את כתובת האובייקט, ולפיה רואים אם מדובר באותו אובייקט או בעותק.copy.copy מעתיק רק את השכבה העליונה. רשימות פנימיות נשארות משותפות בין המקור לעותק. copy.deepcopy מעתיק את כל המבנה לכל העומק.הטקסט המלא של הדקות הראשונות בהרצאה «Mutable - חלק 2» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, בסרטון הנוכחי נדבר קצת על מיוטאבל ועל אי-מיוטאבל, נלמד מה זה אומר, מה המשמעות של זה בשפה ואיפה אנחנו ניתקל בזה.
אז מיוטאבל זהו משתנה שהוא ניתן לשינוי, לעומת זאת אי-מיוטאבל זה משתנה שהוא לא ניתן לשינוי. אז נתחיל בדוגמה מאוד פשוטה, נגיד יש לנו משתנה שהוא שווה למספר, מספר הוא אי-מיוטאבל, כלומר הוא לא ניתן לשינוי, אבל זה לא אומר שאי אפשר ליצור מחדש את A.
כלומר, אני כן יכול לעשות עכשיו A שווה ל-6, אבל זה לא באמת אומר ש-A השתנה. כלומר, כן השתנה. מה שקרה לנו פה בעצם, אם נסתכל על שכבת הזיכרון של פייתון, אז הערך 5 או הערך 6 לא נכתבו מחדש במיקום שלהם בזיכרון.
מה שקרה לנו פה בעצם, ה-A עכשיו מצביע על מקום חדש בזיכרון שבו יש את הערך 6. אותו דבר זה גם סטרינג אם יש לנו למשל את הסטרינג a שווה לסטרינג 444 עכשיו אני אכתוב שa שווה לסטרינג 555 444 עדיין קיים בזיכרון בעצם שאנחנו עושים a שווה 555 זה לא שהלכנו למקום בזיכרון של 444 מחקנו אותו וכתבנו שם 555 אלא נוצר מקום חדש בזיכרון שמכיל בתוכו את הסטרינג 555 מה
המשמעות של הדבר כדי להבין את המשמעות נדבר על משתנים שהם אי-מיו- שהם מיוטבל, כלומר, דברים שהם כן יכולים להשתנות. למשל, ליסטים ודיקשנריז.
בואו למשל ניצור ליסט, נקרא לו l, ליסט שווה לליסט הכי פשוט, ליסט באורך 3. עכשיו, אם אני עושה l2 שווה ל-l, l2 ו-l מצביעים על אותו מקום בזיכרון.
אם לעומת זאת אני אעשה a2 שווה a, a2 לא מצביע על אותו מקום בזיכרון. מה אני מתכוון? תסתכלו a שווה ל-5,5,5 a2 גם שווה ל-5,5,5 עכשיו, מה יקרה אם אני אעשה a2 שווה ל-6,6,6 a2 שווה ל-6,6,6 אבל a עדיין שווה ל-5,5,5 בואו נבדוק אם זה אותו דבר גם עבור ליסט l שווה ל-0,1,2 אם אני אוסיף ל-l ישתנה
הוא יתווסף אליו והוא גם יתווסף ל-l2 שימו לב שיש פה הבדל מאוד גדול בין מיוטבל לאי-מיוטבל. כלומר, משתנה מיוטבל, ברגע שעושים השמה של משתנה מיוטבל אחד לשני, אז שני הם מצביעים על אותו מקום.
שינוי של אחד ישנה גם את השני. לעומת זאת, טרינגים ובאינטג'רים הדבר הוא הפוך. כלומר, יש פה איזשהו של קונסטנט, כן ולא.
מצד אחד נראה שאפשר לשנות אותו, מצד שני, אם אנחנו עושים ערך אחר של משתנה ששווה אחד לשני ואנחנו משנים את אחד מהם, השני לא משתנה. פייתון היא שפה שהיא garbage-collector-y, אם אפשר להגיד את זה ככה, היא שפה מנוהלת, כלומר אין לנו צורך פה למחוק דברים, כל הזיכרון מנוהל על ידי השפה, הסטרינגים והליסטים, ברגע שהאינטרפרטר, ברגע ששפת פייתון,
המכונה הוויפטואלית רואה שכבר אין לנו שימוש בזיכרון הזה, אולי כי עברנו לפונקציה אחרת, או נגמר לה הזיכרון והיא רואה שאנחנו, בעיקר שימוש שכבר אין גישה למשתמש, למשל בהתחלה הצמנו a שווה 5, לאחר מכן עשינו a שווה 6, כלומר אין שום גישה ל-5, אז פאט פייתון תדאג לנו והיא תמחק את הדבר הזה.
שימו לב שאם אנחנו רוצים ש-l2 יהיה ערך עצמאי, כל מה שצריך לעשות זה או להשתמש בפונקציית קופי, או פשוט לעשות את דרך הקיצור הזאת, l2 שווה ל-l, פשוט לשים פה רק נקודותיים, ואז שינוי של L לא ישפיע על L2.
חשוב במיוטבל לדבר גם על מה קורה במצב שיש לנו בתוך שרשור, לא שרשור, אלא ליסט בתוך ליסט. אני אתן דוגמה. יש לנו A שהוא שווה ל-1, 2, 3, ויש לנו B ששווה ל-4, 5, 6, ויש לנו את C ששווה ל-A ו-B.
ככה נראה C. שימו לב שאפשר לגשת ל-C, באינדקס כפול סוג של כביכול מטריצה עכשיו כדי ליצור העתק של c יש לנו מודול שלא דיברנו על מודול אבל יש לנו מודול שנקרא קופי המודול קופי יש לנו שתי פונקציות עיקריות אחת מהן זה קופי והשנייה זה דיפ קופי תשימו לב קופי דיפ קופי מופיע פה קופי מופיע פה בסוף מה ההבדל בין קופי לדיפ קופי בוא נגיד שd שווה
לקופי נקודה קופי של c אז עכשיו עשינו העתק, העתק הזה הוא העתק שלאוד קופי. איך אפשר להוכיח את זה?
יש לנו פונקציה בפייתרון שנקראת ID. ID בעצם מראה את המקום בזיכרון של האלמנטים האלה, אז ה-ID של C הוא איזשהו משהו כלשהו של פייתרון, זה לא משנה הערך, רק חשוב לראות את ההבדלים.
אז ה-ID של C, האם הוא שווה ל-ID של D? התשובה היא לא, כי עשינו קופי. לעומת זאת, כמובן יש פה טייפו, האם הטייפו של, האם ה-D שווה ל-C? התשובה היא לא, כי השתמשנו בקופי.
אבל האם הערך של D במקום האפס שווה ל-C במקום האפס? התשובה היא כן, כי זה רק שלו קופי. כלומר, הליסטים הפנימיים, העתקנו את הכתובת שלהם בזיכרון.
כדי להעתיק באמת העתקה לכל העומק, נשתמש בפונקציה שנקראת DeepCopy, שגם נמצאת במודול DeepCopy. עכשיו, אם נעשה השוואה של D של E ל-C, נראה שבאמת יש לנו העתקה לכל העומק ואפשר לשנות כל האיברים.
עוד מקום שבו מיוטבול ואי מיוטבול הוא מאוד רלוונטי הוא בדיקשנריז. קי של דיקשנרי חייב להיות אי מיוטבול. כלומר, אם ננסה ליצור דיקשנרי שהקי שלו הוא מיוטבול, כלומר ניתן לשנות, אנחנו לא נצליח לעשות את זה.
ואני אראה לכם את זה בדוגמה מאוד מאוד פשוטה. ננסה עכשיו ליצור דיקשנרי, נקרא לו di שווה ל... נעשה list בתור קי, נביאה על סטרינג.