English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا المقال، ستتعرف على مساحة الاسم، من التسمية إلى العنصر، ومدى تطبيق المتغيرات.
إذا كنت قد قرأت 'Python's Zen (The Zen of Python)' (أدخل import this في معالج Python)، يُشير السطر الأخير إلى،الفكرة الرائعة هي أن تكون مساحة الاسم رائعة - دعونا نفعل المزيد!إذن، ما هي هذه المسافات المجهولة؟ دعونا نرى ما هو الاسم أولاً.
الاسم (أو المعرف) هو مجرد اسم الم赋予 للعنصر. كل شيء في Python هوالعناصر. الاسم هو طريقة للوصول إلى العنصر الأساسي.
على سبيل المثال، عندما نقوم بعملية التخصيص a = 2، 2 هو عنصر مخزن في الذاكرة، وaهي الأسماء المرتبطة بها. يمكننا الوصول إلى العنصر الأساسي عبرالوظائف المدمجة الحصول على عنوان بعض العناصر (في الذاكرة) باستخدام id(). دعونا نرى كيف يمكننا استخدامها.
# تنبيه: قد تحصل على قيم id مختلفة a = 2 print('id(2) =', id(2)) print('id(a) = ', id(a))
نتائج الخروج
id(2) = 9302208 id(a) = 9302208
في هذا السياق، كلاهما يشيران إلى نفس العنصر 2، لذا لديهما نفس id(). دعونا نفعل شيئًا ممتعًا.
# تنبيه: قد تحصل على قيم id مختلفة a = 2 print('id(a) = ', id(a)) a = a + 1 print('id(a) = ', id(a)) print('id(3) = ', id(3)) b = 2 print('id(b) = ', id(b)) print('id(2) =', id(2))
نتائج الخروج
id(a) = 9302208 id(a) = 9302240 id(3) = 9302240 id(b) = 9302208 id(2) = 9302208
ماذا يحدث في سلسلة الخطوات السابقة؟ دعونا نوضح ذلك باستخدام رسم.
في البداية، يتم إنشاء كائن 2 وربط الاسم a به، عند تنفيذ a = a + 1، يتم إنشاء كائن جديد 3، ويتم ربط a بهذا الكائن الآن.
لاحظ أن id(a) و id(3) لهما نفس القيمة.
بالإضافة إلى ذلك، عند تنفيذ b = 2، يتم ربط الاسم الجديد b مع الكائن السابق 2.
هذا صحيح لأن بايثون لا يحتاج إلى إنشاء كائنات جديدة مكررة. خاصية الربط الديناميكي للأسماء تجعل بايثون قويًا.
>>> a = 5 >>> a = 'هلاُعالم!" >>> a = [1,2,3]
كل هذا صحيح،aسنقوم بالاستدعاء في أمثلة مختلفة لثلاثة أنواع من الكائنات المختلفة.الوظيفةهي أيضًا كائنات، لذا يمكننا أيضًا استدعاء الأسماء لاستدعائها.
def printHello(): print("هلا") a = printHello a()
نتائج الخروج
هلا
الاسم نفسهaيمكننا استدعاء وظيفة، ونستطيع استخدام هذا الاسم لاستدعاء الوظيفة.
الآن بعد أن عرفنا ما هو الاسم، يمكننا مواصلة الحديث عن مفهوم النطاق.
بشكل بسيط، النطاق هو مجموعة من الأسماء.
في بايثون، يمكنك تصور النطاق كخريطة من كل اسم إلى العنصر المتبادل.
يمكن للنطاقات المختلفة أن توجد في نفس الوقت، لكنها معزولة تمامًا.
عند بدء تشغيل محول بايثون، يتم إنشاء نطاق يحتوي على جميع الأسماء المدمجة، ويبقى هذا النطاق قائم طالما كان المحول يعمل.
لذلك، السبب في أن الوظائف المدمجة (مثل id()) و print() وغيرها يمكن استخدامها دائمًا من أي جزء من البرنامج هو أن كل منها.الوحدةإنشاء نطاق عالمي الخاص بك.
هذه النطاقات المختلفة معزولة. لذلك، لن يحدث تضارب بين الأسماء الموجودة في وحدات مختلفة.
الوحدات يمكن أن تحتوي على أنواع متعددة من الوظائف والفئات. يتم إنشاء نطاق محلي عند استدعاء الوظيفة، حيث يتم تعريف جميع الأسماء. يشبه الفئات. الصورة التالية قد تساعد في توضيح هذا المفهوم.
على الرغم من أننا قد قمنا بتعريف نطاقات أسماء فريدة، لكن قد لا نتمكن من الوصول إليها من كل جزء من البرنامج. مفهوم النطاق يبدأ في العمل.
النطاق هو جزء من البرنامج، حيث يمكن الوصول إلى النطاقات مباشرة دون أي بدل مقدم.
هناك دائمًا على الأقل ثلاثة نطاقات مدمجة في أي وقت معين.
نطاق الدالة الحالية الذي يحتوي على أسماء محلية
نطاق الوحدة التي تحتوي على أسماء عالمية
أعلى نطاق يحتوي على أسماء مدمجة
عند إجراء الاستدلال في الدالة، يتم البحث في النطاق المحلي أولاً، ثم في النطاق العالمي، وأخيرًا في النطاق المدمج.
إذا كان هناك دالة داخل دالة أخرى، فإن النطاق الجديد يتداخل في النطاق المحلي.
def outer_function(): b = 20 def inner_func(): c = 30 a = 10
في هذا السياق، المتغيرaفي نطاق العالمي. المتغيرbفي نطاق المحلي في outer_function() وcفي نطاق المحلي المدمج في inner_function().
عندما نكون في inner_function()،cفي محلينا،bفي غير المحلي،aعالمي. يمكننا أن نعطيcقراءة وتخصيص قيمة جديدة، لكن يمكن فقط قراءتهاbوainner_function().
إذا حاولنا تخصيص كقيمةb، متغير جديدbفي إنشاء مختلف في نطاق المحلي مقارنة بالنطاق غير المحليb. عند تخصيص قيمة، يحدث نفس الشيءواحد.
لكن، إذا كنا نريدaإعلانه كعالمي a، فإن كل الإشارات والتخصيصات ستنتقل إلى العالميa. وبالمثل، إذا أردنا إعادة تعيين المتغيرbإذا كان يجب على هذا المتغير أن يكون غير محلي، فيجب أن يتم إعلانه كغير محلي. مثال لاحق سيوضح ذلك.
def outer_function(): a = 20 def inner_function(): a = 30 print('a = inner_function() print('a = a = 10 print('a =
كما ترون، يتم إخراج البرنامج.
a = 30 a = 20 a = 10
في هذا البرنامج، تم تعريف ثلاثة متغيرات مختلفة في نطاقات مختلفة من الأسماءaوتم إجراء الوصول المناسب. في البرنامج التالي،
def outer_function(): global a a = 20 def inner_function(): global a a = 30 print('a = inner_function() print('a = a = 10 print('a =
يتم إخراج البرنامج.
a = 30 a = 30 a = 30
في هذا السياق، بسبب استخدام الكلمة المفتاحية global، كل الاستدلالات والتخصيصات تشير إلى المتغير a العالمي.