במדריך זה, נלמד על מרחב השמות ב-Python, המבנה המשמש לארגון השמות הסמליים המוקצים לאובייקטים בתוכנת Python, מדוע מרחב השמות חשוב וכיצד נוכל להשתמש בהם בתכנית Python שלנו. בואו לקבל מבוא קצר למרחב שמות.
מה זה מרחב שמות?
ב-Python, דרך לתת לכל אובייקט שם ייחודי היא באמצעות מרחב שמות. משתנים ושיטות הם דוגמאות לאובייקטים ב-Python. בניסוח אחר, מדובר באוסף של השמות הסמליים הידועים והפרטים על הדבר שאליו מתייחס כל שם. ניתן לחשוב על שם כמפתח במילון, ואובייקטים הם הערכים במרחב שמות. אנחנו צריכים להבין את זה עם דגם מקורי - מרחב שמות דומה לשם משפחה. אם יש מספר שמות 'פיטר' בכיתה, ייתכן שיהיה קשה לאתר שם 'פיטר'; עם זאת, כאשר אנו מבקשים במפורש 'פיטר וורנר' או 'פיטר קאמינס', בכיתה, ייתכן שלא נפוץ שמספר תלמידים יהיו בעלי אותו שם פרטי ושם משפחה.
מתורגמן Python יכול לקבל הבנה טובה יותר של השיטה או המשתנה המדויק בקוד הודות למרחב השמות. כתוצאה מכך, שמו מכיל מידע נוסף, כולל Space (קשור להיקף) ו-Name, המציין מזהה ייחודי.
ב-Python, ישנם ארבעה סוגים של מרחבי שמות המופיעים להלן.
- מובנה
- גלוֹבָּלִי
- סוגר
- מְקוֹמִי
מכיוון שלמרחבי השמות השונים הללו יש משך חיים, מתורגמן Python יוצר מרחבי שמות לפי הצורך ומוחק אותם כאשר הם אינם נחוצים יותר.
בואו נבין את הסוגים השונים של מרחב השמות ב-Python.
מרחב השמות המובנה
כפי שהשם שלו מרמז, הוא מכיל שמות מוגדרים מראש של כל האובייקטים המובנים של Python שכבר זמינים בפייתון. בואו נרשום את השמות האלה עם הפקודה הבאה.
פתח את מסוף Python והקלד את הפקודה הבאה.
יישומי מחשוב ענן
פקודה -
dir(__builtins__)
תְפוּקָה:
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
מרחב השמות המובנה יוצר על ידי מתורגמן Python כאשר הוא מופעל. אלה מסתיימים כאשר מתורגמן Python מסתיים.
מרחב השמות הגלובלי
מרחב השמות הגלובלי מורכב מכל שמות ב-Python בכל רמה של התוכנית הראשית. הוא נוצר כאשר הגוף הראשי מבצע ונשאר קיים עד שהמתורגמן מסתיים.
מתורגמן Python יוצר מרחב שמות גלובלי עבור כל מודול שה-Python שלנו טוען עם הצהרת הייבוא. כדי לקבל מידע נוסף, בקר במודול Python שלנו.
מרחבי השמות המקומיים והסובבים
מרחבי השמות המקומיים משמשים את הפונקציה; כאשר הפונקציה מופעלת, מתורגמן Python יוצר מרחב שמות חדש. מרחבי השמות המקומיים ממשיכים להתקיים לאחר שהפונקציה תסיים לפעול. היכולת יכולה להיות מורכבת גם מיכולת אחרת. כפי שמוצג להלן, אנו יכולים להגדיר פונקציה אחת בתוך אחרת.
דוגמא -
def f(): print('Initiate f()') def g(): print('Initiate g()') print('End g()') return g() print('Initiate f()') return f()
במודל הנ'ל, היכולת g() מאופיינת בתוך אוסף f(). קראנו לפונקציה g() בתוך הפונקציה f() ולפונקציה f() הראשית. בואו נסתכל כיצד פועלת הפונקציה לעיל:
- Python יוצר מרחב שמות חדש עבור f() כאשר אנו קוראים לו.
- באופן דומה, ה-f() קורא ל-g(), g() מקבל מרחב שמות שונה משלו.
- מרחב השמות המקומי g() נוצר עבור מרחב השמות המקיף, f().
כל אחד ממרחבי השמות הללו מסתיים כאשר הפונקציה מסתיימת.
כיצד להמיר char ל-string Java
היקף האובייקט/משתנה
המונח 'היקף' מציין לאיזה אזור קידוד של אובייקט Python מסוים ניתן לגשת. לכל אובייקט ומשתנה יש היקף בתוכנית שממנו נוכל לגשת למשתנה הזה. לדוגמה, ניתן לגשת למשתנה פונקציה רק בתוך הפונקציה. הבה נבחן את ההמחשה הבאה:
דוגמא -
def scope_func(): print('Inside scope_func') def scope_inner_func(): var = 20 print('Inside inner function, value of var:',var) scope_inner_func() print('Try printing var from outer function: ',var) scope_func()
תְפוּקָה:
Inside scope_func Inside inner function, value of var: 20 Traceback (most recent call last): File 'd:/Python Project/listproblems.py', line 343, in scope_func() File 'd:/Python Project/listproblems.py', line 342, in scope_func print('Try printing var from outer function: ',var) NameError: name 'var' is not defined
מילוני מרחב השמות של פייתון
במדריך הקודם, דיברנו על איך מרחבי שמות הם כמו מילונים, כאשר מפתחות מייצגים שמות אובייקטים וערכים המייצגים אובייקטים בפועל. בתור מילונים, Python משתמש במרחבי שמות גלובליים ומקומיים כאחד. גישה למילוני מרחב שמות גלובליים ומקומיים מתאפשרת על ידי השיטות globals() ו-locals() של Python.
שיטת globals()
השיטה globals() מחזירה הפניה למילון מרחב השמות הגלובלי הנוכחי. אנחנו יכולים להשתמש בו כדי לגשת לאובייקטים במרחב השמות הגלובלי. בוא נראה את הדוגמה למטה.
דוגמא -
>>> type(globals()) >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': }
כפי שאנו יכולים לראות את זה, יש הרבה ערכים מובנים גלובלים() שיטה. זה עשוי להיות שונה בהתאם למערכת ההפעלה שלך ולגרסת Python. כעת הבה נגדיר את המשתנה הגלובלי ונתבונן בהבדלים.
אלגוריתם מינימקס
>>> a = 20 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 20}
לאחר הקצאת a = 20, משתנה גלובלי חדש שהוקצה למילון מרחב השמות הגלובלי. אנו יכולים לגשת לערכים כפי שאנו ניגשים במילונים. בוא נראה את הדוגמה למטה.
>>> a = 20 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 20} >>> a 20 >>> globals()['a'] 20
אנו יכולים לשנות את ערך המילון באמצעות הפונקציה globals() .
>>> globals()['a'] = 100 >>> a 100
כעת הערך החדש של a יופיע במילונים הגלובליים.
הפונקציה locals()
Python מספקת גם את השיטה locals() בדומה ל-globals() אך ניגשת לאובייקטים במרחב השמות המקומי במקום זאת. בואו נראה את הדוגמה הבאה.
דוגמא -
>>> def func(a, b): ... str1 = 'Hello' ... loc = locals() ... print(loc) ... >>> func(10, 20) {'a': 10, 'b': 20, 'str1': 'Hello'}
כאשר אנו קוראים ל-func(10, 20), ה-locals() מחזירים את המילון המייצג את מרחב השמות המקומי של הפונקציה. ב-scope הפונקציה, הגדרנו את המשתנה המקומי str1; מרחב השמות המקומי כלל את הארגומנטים של הפונקציה מכיוון שהם מקומיים ל-func().
עם זאת, כאשר אנו קוראים ל-local people() capability, זה פועל שווה ערך ליכולת globals() . הפונקציה globals() והפונקציה locals() שונות מעט. הפונקציה globals() לא רק מגדירה משתנים נוספים אלא גם מאחסנת את ערך ההחזרה. המילון יכיל את המשתנים החדשים ואת ערכיהם. תסתכל על הדוגמה למטה.
דוגמא -
>>> glob_var = globals() >>> glob_var {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 100, 'func': , 'glob_var': {...}, 'x': 100, 'y': 'JavaTpoint'} >>> x = 100 >>> glob_var {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 100, 'func': , 'glob_var': {...}, 'x': 100, 'y': 'JavaTpoint'}
הנה ה glob_var הוא הפניה למילון מרחב השמות הגלובלי. הצהרות המשימה החדשות איקס ו ו הופיע ב glob_var מילון.
שינוי משתנים מחוץ לתחום
בסביבה המתקשרת, הפונקציה יכולה לשנות את הארגומנט על ידי העברת ערך אחר, אך לפעמים היא לא יכולה לשנות את הערך.
לא ניתן לשנות ארגומנט בלתי ניתן לשינוי על ידי פונקציה.
ניתן לשנות ארגומנט שניתן לשנות במקום, אך לא ניתן להגדיר אותו מחדש לחלוטין.
בואו נבין את התרחיש הבא.
דוגמא -
x = 20 def func(): x = 40 print(x) func() print(x)
תְפוּקָה:
40 20
אנו מגדירים משתנה גלובלי x = 20 וגם בפונקציה עם אותו שם. כאשר ה-func() מופעל, הוא יוצר את ההפניה למשתנה המקומי החדש לאובייקט מספר שלם שהערך שלו הוא 40. בתוך func() body, הצהרת ההקצאה לא תשפיע על האובייקט הגלובלי.
עם זאת, פונקציה יכולה לשנות אובייקט מסוג שניתן לשינוי מחוץ להיקף המקומי שלה. בואו נבין את הדוגמה שלהלן.
לנעול אפליקציית אנדרואיד
דוגמא -
my_list = ['Hello', 'From', 'JavaTpoint'] def func(): my_list[1] = 'Welcome to' return my_list print(func())
ה-my_list היא רשימה והיא ניתנת לשינוי. ה-func() יכול לשנות בתוך my_list למרות שהוא מחוץ להיקף המקומי. אבל, אם ננסה להקצות מחדש את ה-my_list, היא תיצור את האובייקט המקומי החדש ולא ישנה את ה-my_list הגלובלית. בוא נראה את הדוגמה למטה.
דוגמא -
my_list = ['Hello', 'from', 'JavaTpoint'] def func(): my_list = ['A', 'B', 'C', 'D', 'E', ''] return my_list print(func())
תְפוּקָה:
['A', 'B', 'C', 'D', 'E']
סיכום
אנו דואגים למרחב השמות, כיצד נוכל לנצל אותו ומידת המשתנה. ניתן ליצור מספר רב של אובייקטים נפרדים עם תוכנית Python קצרה. מספר זה עשוי לעלות על אלף בתוכנית Python מסובכת. מרחב השמות של Python מקל על המתורגמן לזכור את שמות האובייקטים הללו.