PracticU

Mutable - מבוא

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

Mutable - מבוא
השיעור פותח את נושא המיוטבל והאי-מיוטבל בפייתון: האם משתנה נוצר מחדש בכל השמה, או שאובייקט משותף משתנה לכל השמות שמצביעים עליו.
השלבים העיקריים
1. מספרים ומחרוזות: מספר או מחרוזת אינם ניתנים לשינוי. כאשר a = 7, b = a ואחר כך b = 9, שני המשתנים נשארים שונים, והערך של a נשאר 7.
2. רשימות: a = [1], b = a, ואז a.append(2) מוסיף את הערך גם ל-b, כי שניהם מצביעים לאותה רשימה.
3. השמה מחדש: אם מבצעים b = [], b מצביע לרשימה חדשה, ו-a נשאר עם התוכן שלו.
4. בדיקה: הפונקציה id מראה אם שני משתנים מצביעים לאותו אובייקט.
פקודות והגדרות
- copy.copy יוצר עותק של השכבה העליונה בלבד.
- copy.deepcopy יוצר עותק עמוק של כל המבנה, כך שאין שיתוף של רשימות פנימיות.
- השמה פשוטה ללא פונקציית העתקה לא יוצרת עותק.
שימו לב
כאשר רוצים שני משתנים עם תוכן זהה שאינם תלויים זה בזה, יש להעתיק אותם. השמה פשוטה יוצרת רק שם נוסף לאותו אובייקט.
ההבנה הזאת חשובה לכל מי שעובד עם רשימות ומילונים מכמה מקומות בקוד.
השיעור הבא בקורס: Mutable - חלק 1

פרקי ההרצאה: Mutable - מבוא

  1. 00:00

    מיוטאבל ואי-מיוטאבל בפייתון: מבוא

  2. 00:40

    השמה של מספר: האם המשתנה השתנה

  3. 01:15

    שינוי רשימה והשפעה על משתנים שותפים

  4. 01:51

    השמת רשימה חדשה לא משנה את השני

  5. 02:28

    יצירת העתק עצמאי של רשימה

  6. 03:25

    הוכחה שההעתק נמצא במקום אחר בזיכרון

  7. 04:01

    deepcopy ושיטת העתקה בקיצור

תמלול ההרצאה: Mutable - מבוא

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

  1. 00:03

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

  2. 00:20

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

  3. 00:33

    אני אסביר. למשל, בואו ניצור משתנה מסוג אינטג'ר, נקרא לו a, ו-a שווה ל-7. עכשיו ניצור את b, שהוא שווה ל-a גם כן.

  4. 00:46

    כלומר, a שווה ל-7, ו-b גם שווה ל-7. מה יקרה אם נשנה את b, ונגיד שהוא שווה ל-9? האם גם a ישתנה? כבר לא. a ו-b הם כרגע שני משתנים שונים לגמרי.

  5. 01:02

    עכשיו, זהו אולי דבר הגיוני וטבעי, אבל בואו ננסה אותו דבר על list ונראה מה קורה. בוא נגיד ש-list שווה a שווה ל-list שיש בו את הערך 1 ו-b גם שווה ל-a ו-b ועכשיו נעשה נוסיף משתנה ל-a כלומר נשנה את ה-list נעשה a.panned שזה הוספה לאיבר בליסט נוסיף לו את האיבר 2

  6. 01:34

    עכשיו ב-a יש את 1 ו-2 ומה יש ב-b 1 ו-2 גם כן כלומר יש לנו פה התנהגות שונה על שתי סוגי משתנים שונים באינטג'ר ששינינו את b ואז a וb כבר לא שווים לאותו ערך.

  7. 01:51

    לעומת זאת פה אנו רואים שa וb שווים לאותו דבר. בואו ננסה לעשות עכשיו עוד דבר. מה אם נעשה שb עכשיו שווה לליסט חדש? מה יקרה ל-a?

  8. 02:06

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

  9. 02:28

    לעומת זאת כשעשינו append אז יצרנו שינינו העתק שגם a וגם b מצביעים עליו. מה קורה אבל אם אנחנו רוצים שa וb יהיו ליסטים שונים?

  10. 02:43

    כלומר נגיד שa שווה לליסט שמכיל בטוחו את האיברים 1 ו-2 ואנו רוצים שגם b יהיה שווה לאותו דבר כמו a אבל אנחנו רוצים שאם נשנה את B אז A לא ישתנה, כלומר ליצור שתי משתנים שונים, כלומר ש-B יהיה לו את אותו תוכן של A אבל מעכשיו כל שינוי של B לא ישנה את A.

  11. 03:04

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

  12. 03:32

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

  13. 04:11

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

  14. 05:00

    שים לב שאם נעשה העתקה פשוטה, ה-id שלהם יהיה

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

ההרצאה הקודמת: Mutable - יתרונות וחסרונות

ההרצאה הבאה: Mutable - חלק 1

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

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