PracticU

Mutable - חלק 2

בלי כתוביותעם כתוביות
PracticU › קורס פייתון - Python › Mutable - חלק 2
מילון מושגים:
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
מחרוזת - סוג נתונים שמייצג רצף של תווים, כלומר טקסט, ומשמש לאחסון מילים, משפטים או כל רצף סימנים.
משתנה - שם שמפנה למקום בזיכרון שבו נשמר ערך שיכול להשתנות במהלך ריצת התוכנית, כמו מספר, טקסט או אובייקט.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.
באג - תקלה או שגיאה בקוד שגורמת לתוכנה להתנהג בניגוד למצופה.

Mutable - חלק 2
השיעור ממשיך את נושא המיוטבל והאי-מיוטבל: מה קורה כשרשימות מועתקות, כשרשימות מקוננות, ולמה מפתח במילון חייב להיות בלתי ניתן לשינוי.
השלבים העיקריים
1. שני שמות לאותו אובייקט: אם l2 = l, שני השמות מצביעים על אותה רשימה, ושינוי דרך אחד מהם נראה גם בשני. לעומת זאת, השמה מחדש של מספר או מחרוזת יוצרת אובייקט חדש, והשם השני לא משתנה.
2. יצירת עותק: משתמשים בפונקציה copy, או בקיצור עם סוגריים מרובעים. הפונקציה id מציגה את כתובת האובייקט, ולפיה רואים אם מדובר באותו אובייקט או בעותק.
3. העתקה שטחית מול עמוקה: copy.copy מעתיק רק את השכבה העליונה. רשימות פנימיות נשארות משותפות בין המקור לעותק. copy.deepcopy מעתיק את כל המבנה לכל העומק.
4. ניהול זיכרון: פייתון מנהלת את הזיכרון בעצמה. אובייקט שאין אליו אף שם נמחק.
5. מפתח במילון: מפתח חייב להיות בלתי ניתן לשינוי. ניסיון להשתמש ברשימה כמפתח נכשל. אם רוצים מפתח מורכב, עוטפים את הרשימה בטאפל.
שימו לב
טאפל עם איבר אחד מחייב פסיק אחרי האיבר. בלי הפסיק פייתון מפרשת את הסוגריים כסתם סוגריים, והערך נשאר רשימה. גם טאפל שמכיל רשימה מאפשר לשנות את הרשימה הפנימית, כי הטאפל עצמו לא משתנה, אבל מה שבתוכו כן.
הבנה של ההבדל הזה חוסכת באגים רבים כשעובדים עם מבני נתונים שמשותפים לכמה מקומות בקוד.
השיעור הבא בקורס: כתיבת Script המגלה כתובת IP חיצונית

פרקי ההרצאה: Mutable - חלק 2

  1. 00:00

    מיוטאבל ואי-מיוטאבל: מה זה אומר

  2. 01:45

    רשימות כמשתנים מיוטאבל

  3. 02:23

    השמה בין משתנים מסוג מיוטאבל

  4. 03:23

    הבדל בין מיוטאבל לאי-מיוטאבל בהשמה

  5. 04:40

    העתקת רשימה כערך עצמאי

  6. 05:36

    רשימה בתוך רשימה וגישה באינדקס כפול

  7. 06:17

    copy לעומת deepcopy

  8. 07:31

    מפתח במילון חייב להיות אי-מיוטאבל

תמלול ההרצאה: Mutable - חלק 2

הטקסט המלא של הדקות הראשונות בהרצאה «Mutable - חלק 2» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:03

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

  2. 00:16

    אז מיוטאבל זהו משתנה שהוא ניתן לשינוי, לעומת זאת אי-מיוטאבל זה משתנה שהוא לא ניתן לשינוי. אז נתחיל בדוגמה מאוד פשוטה, נגיד יש לנו משתנה שהוא שווה למספר, מספר הוא אי-מיוטאבל, כלומר הוא לא ניתן לשינוי, אבל זה לא אומר שאי אפשר ליצור מחדש את A.

  3. 00:41

    כלומר, אני כן יכול לעשות עכשיו A שווה ל-6, אבל זה לא באמת אומר ש-A השתנה. כלומר, כן השתנה. מה שקרה לנו פה בעצם, אם נסתכל על שכבת הזיכרון של פייתון, אז הערך 5 או הערך 6 לא נכתבו מחדש במיקום שלהם בזיכרון.

  4. 01:04

    מה שקרה לנו פה בעצם, ה-A עכשיו מצביע על מקום חדש בזיכרון שבו יש את הערך 6. אותו דבר זה גם סטרינג אם יש לנו למשל את הסטרינג a שווה לסטרינג 444 עכשיו אני אכתוב שa שווה לסטרינג 555 444 עדיין קיים בזיכרון בעצם שאנחנו עושים a שווה 555 זה לא שהלכנו למקום בזיכרון של 444 מחקנו אותו וכתבנו שם 555 אלא נוצר מקום חדש בזיכרון שמכיל בתוכו את הסטרינג 555 מה

  5. 01:43

    המשמעות של הדבר כדי להבין את המשמעות נדבר על משתנים שהם אי-מיו- שהם מיוטבל, כלומר, דברים שהם כן יכולים להשתנות. למשל, ליסטים ודיקשנריז.

  6. 01:57

    בואו למשל ניצור ליסט, נקרא לו l, ליסט שווה לליסט הכי פשוט, ליסט באורך 3. עכשיו, אם אני עושה l2 שווה ל-l, l2 ו-l מצביעים על אותו מקום בזיכרון.

  7. 02:23

    אם לעומת זאת אני אעשה 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 ישתנה

  8. 03:05

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

  9. 03:23

    שינוי של אחד ישנה גם את השני. לעומת זאת, טרינגים ובאינטג'רים הדבר הוא הפוך. כלומר, יש פה איזשהו של קונסטנט, כן ולא.

  10. 03:34

    מצד אחד נראה שאפשר לשנות אותו, מצד שני, אם אנחנו עושים ערך אחר של משתנה ששווה אחד לשני ואנחנו משנים את אחד מהם, השני לא משתנה. פייתון היא שפה שהיא garbage-collector-y, אם אפשר להגיד את זה ככה, היא שפה מנוהלת, כלומר אין לנו צורך פה למחוק דברים, כל הזיכרון מנוהל על ידי השפה, הסטרינגים והליסטים, ברגע שהאינטרפרטר, ברגע ששפת פייתון,

  11. 04:06

    המכונה הוויפטואלית רואה שכבר אין לנו שימוש בזיכרון הזה, אולי כי עברנו לפונקציה אחרת, או נגמר לה הזיכרון והיא רואה שאנחנו, בעיקר שימוש שכבר אין גישה למשתמש, למשל בהתחלה הצמנו a שווה 5, לאחר מכן עשינו a שווה 6, כלומר אין שום גישה ל-5, אז פאט פייתון תדאג לנו והיא תמחק את הדבר הזה.

  12. 04:35

    שימו לב שאם אנחנו רוצים ש-l2 יהיה ערך עצמאי, כל מה שצריך לעשות זה או להשתמש בפונקציית קופי, או פשוט לעשות את דרך הקיצור הזאת, l2 שווה ל-l, פשוט לשים פה רק נקודותיים, ואז שינוי של L לא ישפיע על L2.

  13. 05:01

    חשוב במיוטבל לדבר גם על מה קורה במצב שיש לנו בתוך שרשור, לא שרשור, אלא ליסט בתוך ליסט. אני אתן דוגמה. יש לנו A שהוא שווה ל-1, 2, 3, ויש לנו B ששווה ל-4, 5, 6, ויש לנו את C ששווה ל-A ו-B.

  14. 05:36

    ככה נראה C. שימו לב שאפשר לגשת ל-C, באינדקס כפול סוג של כביכול מטריצה עכשיו כדי ליצור העתק של c יש לנו מודול שלא דיברנו על מודול אבל יש לנו מודול שנקרא קופי המודול קופי יש לנו שתי פונקציות עיקריות אחת מהן זה קופי והשנייה זה דיפ קופי תשימו לב קופי דיפ קופי מופיע פה קופי מופיע פה בסוף מה ההבדל בין קופי לדיפ קופי בוא נגיד שd שווה

  15. 06:17

    לקופי נקודה קופי של c אז עכשיו עשינו העתק, העתק הזה הוא העתק שלאוד קופי. איך אפשר להוכיח את זה?

  16. 06:32

    יש לנו פונקציה בפייתרון שנקראת ID. ID בעצם מראה את המקום בזיכרון של האלמנטים האלה, אז ה-ID של C הוא איזשהו משהו כלשהו של פייתרון, זה לא משנה הערך, רק חשוב לראות את ההבדלים.

  17. 06:50

    אז ה-ID של C, האם הוא שווה ל-ID של D? התשובה היא לא, כי עשינו קופי. לעומת זאת, כמובן יש פה טייפו, האם הטייפו של, האם ה-D שווה ל-C? התשובה היא לא, כי השתמשנו בקופי.

  18. 07:12

    אבל האם הערך של D במקום האפס שווה ל-C במקום האפס? התשובה היא כן, כי זה רק שלו קופי. כלומר, הליסטים הפנימיים, העתקנו את הכתובת שלהם בזיכרון.

  19. 07:23

    כדי להעתיק באמת העתקה לכל העומק, נשתמש בפונקציה שנקראת DeepCopy, שגם נמצאת במודול DeepCopy. עכשיו, אם נעשה השוואה של D של E ל-C, נראה שבאמת יש לנו העתקה לכל העומק ואפשר לשנות כל האיברים.

  20. 07:47

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

  21. 08:03

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

לקורס המלא: קורס פייתון אונליין למתחילים

ההרצאה הקודמת: Mutable - חלק 1

ההרצאה הבאה: כתיבת Script המגלה כתובת IP חיצונית

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס PHP - פרויקט מעשי