דיונים על וובינר: פיתוח משחק איקס עיגול בפייתון

אז בסוף לא עבר וובינר לייב כמו שאני אוהב אבל במקום זה יש הקלטה שלגמרי כדאי לצפות בה עד הסוף:

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

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

הי מירי,

רוצה לפרט קצת - איך חשבת ליצור את הטבלא? איפה נתקעת?

נתקעתי ביצירת הטבלה. מכיוון שאין לי for שיכול להכניס לי נתונים.
לאחר שאני מקבלת את 2 השמות של השחקנים אני מעוניינת להכניס את שמם למערך. שבמערך יהיה שם וציון לכל משתמש. שזה בעצם מערך של מערכים שויים. ואני מעדכנת את המערך מיד אחרי הודעת הניצחון או שויון. ואז אני מעוניינת לשמור את המערך בקובץ. ועל ידי בקשת המשתמש להדפיס את הטבלה בצורה ממויינת. (האם יש בכלל אפשרות למיין נתונים של קובץ?
תודה רבה
מירה

class Player:
    def __init__(self, Name, Score):
        self.name = Name
        self.score = Score

        self.high_score(self.name, self.score)
        
    def high_score(self, name, score):
        while True:
            HighScores = []
            HighScores.append([self.name, self.score])
            print (HighScores)
            break
       
if __name__ == "__main__":
    name1 = Player(input('Enter the first player name:\n'), 0)
    name2 = Player(input('Enter the second player name:\n'), 0)

כשאני מריצה את זה נשמר לי השם והציון הנוכחי וכל פעם נדרס הראשון. מדוע? אני עושה את הפונקציה append/extend שאמור לצרף ולא לדרוס…
תןדה רבה

הי מירה,

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

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

x = [10, 20, 30]
x = [40]
print(x)

ברור שהקוד מדפיס 40, למרות ש x קודם התיחס למערך אחר.

התנהגות דומה יכולה לקרות גם בפונקציה, למשל שימי לב לקטע הקוד הבא:

def go():
  x = [10]
  print(x)
  x.append(20)

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

נסי לראות - האם יש בעיה דומה בקוד שלך? איזה שם אצלך עובר להתיחס למשהו אחר במהלך התוכנית? ואיך היית מתקנת את זה?

אגב מומלץ בחום לצפות בהרחבה על הנושא בקורס Python שיעורים 20-25:
https://www.tocode.co.il/bundles/python

אז למעשה השורה הזאת מיותרת?
[] = HighScores
וצריך להיות:
HighScores = HighScores.append([self.name, self.score])

זה גם לא טוב. משום שאין הקצאת מקום למערך
UnboundLocalError: local variable ‘HighScores’ referenced before assignment