4.3 סקופ פתרון
משחק הסקופ¶
קטע 1:
x בתוך func הוא משתנה לוקלי - לא משנה את הגלובלי.
קטע 2:
הפונקציה קוראת את
x הגלובלי (רק קריאה, לא שינוי).
קטע 3:
inner יכולה לקרוא את y של outer - זה נקרא closure.
קטע 4:
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