לדלג לתוכן

4.3 סקופ פתרון

משחק הסקופ

קטע 1:

20
10

x בתוך func הוא משתנה לוקלי - לא משנה את הגלובלי.

קטע 2:

10

הפונקציה קוראת את x הגלובלי (רק קריאה, לא שינוי).

קטע 3:

5

inner יכולה לקרוא את y של outer - זה נקרא closure.

קטע 4:

{'a': 1, 'b': 2}

locals() מחזיר מילון של כל המשתנים המקומיים בסקופ הנוכחי.

חרא על global

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

מציאת הבאג

הבעיה: count = 0 נמצא בתוך הלולאה, כך שהוא מתאפס בכל פעם שנמצאת מחרוזת. בנוסף, אם אין מחרוזות בכלל, count לא מוגדר ו-return count יזרוק שגיאה.

def count_strings(items):
    count = 0
    for item in items:
        if isinstance(item, str):
            count += 1
    return count

result = count_strings(["hello", 5, "world", True, "!"])
print(result)  # 3

מי בסקופ?

global_name = "Amit"
global_score = 100

def show_scope(param):
    local_x = 42
    local_message = "hello"
    print("משתנים מקומיים:", locals())

show_scope("test")
print("משתנים גלובלים:", globals())