l = 50
w = 25
d = (l**2 + w**2)**0.5
print(“The distance you have to swim is:”, d)
בחישוב מחדש:
l = l * 2
w = w + l
print(“Bad news, the NEW distance you have to swim is:”, d)
הייתי מצפה שפייתון יקח את הערכים החדשים של w ו-l ויזין אותם בנוסחה של d, הרי d הוגדר כנוסחה תלויית משתנים ולא כערך ספציפי. במילים אחרות, על d להשתנות עם כל שינוי במשתנים המרכיבים את הנוסחה.
בפועל, מסתבר שהציפיות שלי ושל פייתון לא זהות וההשמה של d הייתה בפועל מספר ולא נוסחה. האם בגלל זה יש הכרח להגדיר שוב את d לפי הערכים החדשים? איך אפשר להימנע מכך?
האם זה עובד כך בכל הסביבות של פייתון?
תודה רבה!
BigBertha
לא תשובה,
תהייה איתך ביחד,
מכיוון ש d = (l ** 2 + w ** 2)**0.5
רץ פעם אחת, אז הערך של d הוא מהריצה הקודמת,
אחת כך, אתה קורה ל d בלי שאמרת לו בעצם להשתנות, אז הערך של d נשאר כשהיה בהרצה הראשונה,
אם היית כותב את זה:
l = l * 2
w = w + l
d = (l ** 2 + w ** 2)**0.5
print(“Bad news, the NEW distance you have to swim is:”, d)
אז עכשיו היית מקבל ערך חדש ל d אחרת הוא משתמש רק ב ערך האחרון שנשמר לו
Yam
היי, זו שאלה טובה אז מגיב פה למען הדורות הבאים (יודע שזה בשנה+ של איחור, אבל לא תמיד מספיקים הכל :))
כשפייתון קורא את קוד, הוא קורא אותו שורה שורה מלמעלה למטה.
הוא לעולם לא יחזור להסתכל על שורה שכתבת למעלה.
סדר הריצה תמיד קבוע:
קוראים את השורה הראשונה
קוראים את השורה השנייה
קוראים את השורה השלישית
וכן הלאה.
כאשר אנחנו מבצעים השמה (x = y + 1, לדוגמה), אנחנו מבקשים מפייתון:
להבין מה הם הערכים שנמצאים בצד ימין (לתרגם את y לערך שלו. נניח המספר 5, סתם כדוגמה).
לחשב אותם כך שיהיה ערך “חד משמעי” בצד ימין של ההשמה (במקרה שלנו: 5 + 1 זה 6)
להגדיר את השם בצד שמאל כך שיצביע על הערך שיצא מהחישוב בצד ימין. (במקרה שלנו: x הוא מעין קרן לייזר שמצביעה על הערך 6).
בשלב הזה המשתנה x בכלל לא יודע שהוא מורכב גם מ־y. הוא סתם קרן לייזר שמצביעה על 6.
אם נשנה שורה אחר כך את y, נניח עם הביטוי y = 100, המשתנה x לא יחושב מחדש:
גם כי אנחנו לא קוראים שוב שורות “מלמעלה”
וגם כי x בכלל לא יודע שהוא תוצר חיבור של y + 1 – בשלב הזה הוא סתם יצור שמצביע על הערך 6.