במשתני פייתון ממלאים תפקיד מפתח באחסון וניהול נתונים. ההתנהגות והנגישות שלהם תלויים במקום בו הם מוגדרים בתוכנית. במאמר זה נחקור משתנים גלובליים ומקומיים כיצד הם עובדים ותרחישים נפוצים עם דוגמאות.
משתנים מקומיים
משתנים מקומיים נוצרים בתוך פונקציה וקיימים רק במהלך ביצועו. לא ניתן לגשת אליהם מחוץ לפונקציה.
מחרוזת בפורמט c
דוגמא 1: בקוד זה אנו יוצרים וגישה למשתנה מקומי בפונקציה.
Python
def greet(): msg = 'Hello from inside the function!' print(msg) greet()
תְפוּקָה
Hello from inside the function!
הֶסבֵּר: אנו מגדירים לְבָרֵך() עם משתנה מקומי MSG ולהדפיס אותו. מכיוון ש- MSG קיים רק במהלך ביצוע הפונקציה הוא ניגש לפי הפונקציה. יִעוּד לְבָרֵך() מציג את ההודעה.
דוגמא 2 : בדוגמה זו אנו יוצרים משתנה מקומי בפונקציה ואז מנסים לגשת אליו מחוץ לפונקציה הגורמת לשגיאה.
Pythondef greet(): msg = 'Hello!' print('Inside function:' msg) greet() print('Outside function:' msg)
תְפוּקָה
Traceback (השיחה האחרונה האחרונה):
קובץ '/home/guest/sandbox/solution.py' שורה 6 ב
הדפס ('פונקציה חיצונית:' MSG)
NameError: שם 'msg' אינו מוגדר
הסבר: MSG הוא משתנה מקומי בפנים לְבָרֵך() וניתן לגשת אליו רק לשם. הדפסתו בחוץ גורמת לשגיאה מכיוון שהיא לא קיימת ברחבי העולם.
משתנים גלובליים
משתנים גלובליים מוכרזים מחוץ לכל הפונקציות וניתן לגשת אליהם בכל מקום בתוכנית כולל פונקציות פנים.
בדוגמה זו אנו יוצרים משתנה גלובלי ואז ניגשים אליו בתוך פונקציה ומחוצה לה.
Pythonmsg = 'Python is awesome!' def display(): print('Inside function:' msg) display() print('Outside function:' msg)
תְפוּקָה
Inside function: Python is awesome! Outside function: Python is awesome!
הסבר: MSG הוא משתנה גלובלי הנגיש הן בתוך ומחוצה לו לְהַצִיג() פוּנקצִיָה. יִעוּד לְהַצִיג() מדפיס את הגלובלי MSG והדפסה MSG מחוץ לפונקציה פועלת כצפוי.
פֶּתֶק: אם משתנה לא נמצא בתוך פונקציה (היקף מקומי) פייתון מחפש אותו אוטומטית בהיקף הגלובלי. עם זאת, אם למשתנה מקומי יש שם זהה לזה גלובלי, הוא יציל משתנה גלובלי בתוך הפונקציה הזו.
שימוש במשתנים מקומיים וגלובליים
אם משתנה מוגדר הן גלובלית והן באופן מקומי עם אותו שם, המשתנה המקומי צלל את המשתנה הגלובלי בתוך הפונקציה. שינויים במשתנה המקומי אינם משפיעים על המשתנה הגלובלי אלא אם כן אתה מצהיר במפורש על המשתנה כגלובלי.
Pythondef fun(): s = 'Me too.' print(s) s = 'I love Geeksforgeeks' fun() print(s)
תְפוּקָה
Me too. I love Geeksforgeeks
הֶסבֵּר: בְּתוֹך כֵּיף() ג הוא משתנה מקומי שנקבע גם ל'אני '. ומדפיס את הערך הזה. מחוץ לגלובלי ג נשאר 'אני אוהב Geeksforgeeks' אז הדפסה ג לאחר מכן מראה את הערך הגלובלי.
שינוי משתנים גלובליים בתוך פונקציה
כברירת מחדל אי אפשר לשנות משתנה גלובלי בפונקציה מבלי להכריז עליו כגלובלי. אם תנסה פייתון יעלה שגיאה מכיוון שהוא מתייחס למשתנה כאל מקומי. כדי לשנות משתנה גלובלי השתמש ב- מילת מפתח גלובלית ו
ללא גלובלי (גורם לשגיאה)
Pythondef fun(): s += ' GFG' # Error: Python thinks s is local print(s) s = 'I love GeeksforGeeks' fun()
תְפוּקָה
UnboundLocalerror: משתנה מקומי 'S' מופנה לפני הקצאה
הֶסבֵּר: בפנים () פייתון מניח ש- S הוא מקומי מכיוון שאנו מנסים לשנות את זה. אך אין מקומי מקומי לפני השורה הזו, כך שמתרחשת שגיאה.
עם גלובלי (עובד נכון)
Pythons = 'Python is great!' def fun(): global s s += ' GFG' # Modify global variable print(s) s = 'Look for GeeksforGeeks Python Section' # Reassign global print(s) fun() print(s)
תְפוּקָה
Python is great! GFG Look for GeeksforGeeks Python Section Look for GeeksforGeeks Python Section
הֶסבֵּר:
- הכרזת S כ- Global אומרת לפיתון להשתמש במשתנה מההיקף הגלובלי.
- הפונקציה מוסיפה תחילה 'GFG' ואז מחדש מחדש את s.
- שינויים נמשכים מחוץ לפונקציה.
גלובלי לעומת מקומי עם אותו שם
Pythona = 1 # Global variable def f(): print('f():' a) # Uses global a def g(): a = 2 # Local shadows global print('g():' a) def h(): global a a = 3 # Modifies global a print('h():' a) print('global:' a) f() print('global:' a) g() print('global:' a) h() print('global:' a)
תְפוּקָה
global: 1 f(): 1 global: 1 g(): 2 global: 1 h(): 3 global: 3
הֶסבֵּר:
- F () מדפיס גלובלי A מבלי לשנות אותו.
- G () יוצר מקומי A עוזב עולמי ללא מגע.
- H () מכריז על A כגלובלי ומשנה אותו.
משתנה מקומי לעומת משתנה גלובלי
| בסיס השוואה | משתנה גלובלי | משתנה מקומי |
|---|---|---|
| הַגדָרָה | הוכרז מחוץ לפונקציות | הוכרז בתוך פונקציות |
| מֶשֶׁך הָחַיִים | נוצרה כאשר התוכנית מתחילה ונרוסה כאשר היא מסתיימת | נוצר כאשר הפונקציה נקראת ונהרסת כאשר היא חוזרת |
| שיתוף נתונים | משותף לכל הפונקציות | לא משותף; קיים רק במסגרת תפקידו |
| תְחוּם | ניתן לגשת לכל מקום בתוכנית | נגיש רק בתוך הפונקציה |
| פרמטרים נחוצים | אין צורך בהעברת פרמטרים | ניתן ליצור באמצעות פרמטרים או מטלות בתוך הפונקציה |
| אִחסוּן | מנוהל במרחב השמות הגלובלי (לא מיקום זיכרון קבוע) | מאוחסן במרחב השמות המקומי של הפונקציה (מסגרת ערימה) |
| עֵרֶך | שינויים משפיעים על התוכנית כולה | השינויים הם מקומיים ואינם משפיעים על פונקציות אחרות |