משתנים בפייתון

(החומר בפוסט זה מועבר בשלמותו בקורס פייתון למתחילים)
האמת היא שההגדרה הרשמית של פייתון אפילו לא נוקבת במילה
variables.
פייתון אומרת:

Names refer to objects.

פרק ה data model בהגדרת השפה, מתאר את הנתונים (כלומר הערכים) ב python באמצעות המשפט הסתום הבא:


Objects are Python’s abstraction for data.

בשפה פשוטה, משפט זה אומר כי כל הנתונים (או הערכים) ב python, כולל מספרים שלמים(int), מספרים בעלי נקודה עשרונית(float), מחרוזות וכיו"ב …  הם אובייקטים!!!
אין בפייתון primitive data types כמו בשפת Java למשל.

כדי להבין את השימוש במשתנים (שמות כפי שהם נקראים פורמלית), נביט בשרטוט הבא:
הקוד המתואר הוא: x=5

זוהי השמה (בלע"ז assignment), שגורמת לפעולות הבאות:

א. נוצר אובייקט חדש מסוג int (מספר שלם).
ב.ערך האובייקט נקבע ל 5
ג. נוצר משתנה בשם x
ד. המשתנה "מצביע" על האובייקט שנוצר !

ניתן להשתמש במשתנה החדש בתוך ביטויים:

נשים לב: למשתנים אין type.
הם רק "מתייחסים" (מצביעים) אל האובייקטים (names refer to objects)
לא ניתן "לנעול" משתנה, תמיד אפשר לגרום למשתנה להצביע על אובייקט אחר.
תכונת immutability (שתוסבר בהמשך) היא תכונה של אובייקטים (כלומר ערכים) ולא תכונה של משתנים.
משתנים נוצרים באמצעות השמה (assignment), בזמן ריצת התוכנית (כלומר באופן דינאמי).

immutability

אובייקט ה int שנוצר בדוגמא הקודמת אינו ניתן לשינוי.
מרגע היווצרו (בזמן ההשמה) ועד לסוף חייו (כאשר שום דבר לא "יצביע" עליו), אובייקט זה ישאר קבוע ולא משתנה.
הסיבה לכך היא שסוג האובייקט (שהוא int) הוא immutable.
מה יקרה אם נבצע השמה נוספת לאותו המשתנה?

נניח:

x=7

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

גם הסוגים float ו str לא ניתנים לשינוי בזמן ריצה (כלומר הם immutable).
תכונת ה immutability מבטיחה למתכנת כי כל עוד המשתנה מצביע אל האובייקט, לא יגרם לאובייקט כל שינוי או נזק.
לעומת זאת, ניתן לגרום לכל משתנה להצביע על כל אובייקט שהוא, גם אם קודם הצביע על אובייקט אחר:

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

ניתן לדעת זאת באמצעות ה – id (הזיהוי, identifier) של האובייקטים עליהם מצביעים המשתנים
(במקרה זה שני המשתנים מצביעים על אותו האובייקט):

עתה נשאלת השאלה הבאה:
מה יקרה אם ננסה לשנות את האובייקט באמצעות השמה ל x? (למשל נקליד x=15)
כאמור, נזכור כי אובייקט מסוג int לא ניתן לשינוי (הסוג int הוא immutable) , ולכן נגרום ל – x להצביע על אובייקט חדש מסוג int:

סגור לתגובות.