في هذا البرنامج التعليمي، سوف نتعرف على مساحة الاسم في بايثون، والبنية المستخدمة لتنظيم الأسماء الرمزية المخصصة للكائنات في برنامج بايثون، وسبب أهمية مساحة الاسم، وكيف يمكننا استخدامها في برنامج بايثون الخاص بنا. دعونا نحصل على مقدمة موجزة لمساحة الاسم.
ما هي مساحة الاسم؟
في بايثون، هناك طريقة لإعطاء كل كائن اسمًا فريدًا من خلال مساحة الاسم. المتغيرات والأساليب هي أمثلة للكائنات في بايثون. وبعبارة أخرى، فهي مجموعة من الأسماء الرمزية المعروفة وتفاصيل الشيء الذي يشير إليه كل اسم. يمكن اعتبار الاسم بمثابة مفتاح في القاموس، والكائنات هي القيم الموجودة في مساحة الاسم. يجب أن نكتشف ذلك باستخدام نموذج حقيقي - مساحة الاسم تشبه الاسم الأخير. إذا كان هناك عدة أسماء 'بطرس' في الفصل، فقد يكون من الصعب تحديد اسم 'بطرس'؛ ومع ذلك، عندما نطلب على وجه التحديد 'Peter Warner' أو 'Peter Cummins'، في الفصل الدراسي، قد لا يكون من الشائع أن يكون لدى العديد من الطلاب نفس الاسم الأول واسم العائلة.
يمكن لمترجم 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 بإنشاء مساحة اسم جديدة. تستمر مساحات الأسماء المحلية في الوجود بعد انتهاء تشغيل الوظيفة. يمكن أن تشتمل القدرة أيضًا على قدرة أخرى. كما هو موضح أدناه، يمكننا تعريف وظيفة واحدة داخل أخرى.
مثال -
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() الرئيسية. دعونا نلقي نظرة على كيفية عمل الوظيفة المذكورة أعلاه:
- تنشئ بايثون مساحة اسم جديدة لـ f() عندما نسميها.
- وبالمثل، فإن f() تستدعي g()، وتحصل g() على مساحة اسم مختلفة خاصة بها.
- تم إنشاء مساحة الاسم المحلية g() لمساحة الاسم المتضمنة f().
يتم إنهاء كل من مساحات الأسماء هذه عند إنهاء الوظيفة.
نطاق الكائن/المتغير
يحدد المصطلح 'النطاق' منطقة الترميز لكائن بايثون معين التي يمكن الوصول إليها. كل كائن ومتغير له نطاق في البرنامج يمكننا من خلاله الوصول إلى هذا المتغير. على سبيل المثال، لا يمكن الوصول إلى متغير الوظيفة إلا داخل الوظيفة. دعونا نفحص الرسم التوضيحي التالي:
مثال -
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().
الطريقة العالمية ().
تقوم الطريقة 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 في القواميس العالمية.
حالة بوابة
وظيفة السكان المحليين ().
توفر 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() بإرجاع القاموس الذي يمثل مساحة الاسم المحلية للوظيفة. في نطاق الوظيفة، قمنا بتعريف المتغير المحلي str1؛ تتضمن مساحة الاسم المحلية وسيطات الوظيفة نظرًا لأنها محلية في func().
على الرغم من ذلك، عندما نطلق على قدرة Local People()، فإنها تعمل بشكل مكافئ لقدرة 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. داخل وظيفة () 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 على المترجم أن يتذكر أسماء هذه الكائنات.