इस ट्यूटोरियल में, आप नेमस्पेस, नामों से ऑब्जेक्ट्स की मैपिंग और एक वेरिएबल के दायरे के बारे में जानेंगे।
पायथन में नाम क्या है?
यदि आपने कभी 'द ज़ेन ऑफ पायथन' ( import this
पायथन इंटरप्रेटर में टाइप ) पढ़ा है , तो अंतिम पंक्ति में कहा गया है, नेमस्पेस एक महान विचार का सम्मान कर रहे हैं - चलो उनमें से अधिक करते हैं! तो ये रहस्यमय नाम स्थान क्या हैं? आइए सबसे पहले देखते हैं कि नाम क्या है।
नाम (जिसे पहचानकर्ता भी कहा जाता है) केवल वस्तुओं को दिया गया एक नाम है। अजगर में सब कुछ एक वस्तु है। नाम अंतर्निहित वस्तु तक पहुंचने का एक तरीका है।
उदाहरण के लिए, जब हम काम करते हैं a = 2
, 2
एक वस्तु स्मृति में संग्रहीत है और एक नाम हम इसे साथ जोड़ते है। हम अंतर्निहित फ़ंक्शन के माध्यम से किसी वस्तु का पता (रैम में) प्राप्त कर सकते हैं id()
। आइए देखें कि इसका उपयोग कैसे करना है।
# Note: You may get different values for the id a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))
आउटपुट
id (2) = 9302208 id (a) = 9302208
यहां, दोनों एक ही ऑब्जेक्ट को संदर्भित करते हैं 2
, इसलिए उनके पास समान है id()
। चलिए चीजों को थोड़ा और दिलचस्प बनाते हैं।
# Note: You may get different values for the 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+1
, एक नई वस्तु 3
बनाई जाती है और अब एक इस ऑब्जेक्ट के साथ जुड़ा हुआ है।
ध्यान दें कि id(a)
और id(3)
समान मान हैं।
इसके अलावा, जब b = 2
निष्पादित किया जाता है, तो नया नाम b पिछली वस्तु के साथ जुड़ जाता है 2
।
यह कुशल है क्योंकि पायथन को एक नया डुप्लिकेट ऑब्जेक्ट बनाने की आवश्यकता नहीं है। नाम बंधन की यह गतिशील प्रकृति पायथन को शक्तिशाली बनाती है; एक नाम किसी भी प्रकार की वस्तु को संदर्भित कर सकता है।
>>> a = 5 >>> a = 'Hello World!' >>> a = (1,2,3)
ये सभी मान्य हैं और विभिन्न उदाहरणों में तीन अलग-अलग प्रकार की वस्तुओं का उल्लेख करेंगे। फ़ंक्शंस ऑब्जेक्ट भी हैं, इसलिए एक नाम उन्हें भी संदर्भित कर सकता है।
def printHello(): print("Hello") a = printHello a()
आउटपुट
नमस्कार
एक ही नाम एक फ़ंक्शन को संदर्भित कर सकता है और हम इस नाम का उपयोग करके फ़ंक्शन को कॉल कर सकते हैं।
पायथन में एक नाम स्थान क्या है?
अब जब हम समझते हैं कि नाम क्या हैं, तो हम नामस्थान की अवधारणा पर आगे बढ़ सकते हैं।
बस इसे लगाने के लिए, एक नेमस्पेस नामों का एक संग्रह है।
पायथन में, आप एक नामस्थान की कल्पना कर सकते हैं जो आपके द्वारा संबंधित वस्तुओं को परिभाषित किए गए प्रत्येक नाम के मानचित्रण के रूप में है।
विभिन्न नामस्थान एक निश्चित समय पर सह-अस्तित्व में हो सकते हैं लेकिन पूरी तरह से अलग-थलग हैं।
जब हम पायथन दुभाषिया शुरू करते हैं और जब तक दुभाषिया चलता रहता है, तब सभी नामों में एक नाम स्थान बनाया जाता है।
यही कारण है कि निर्मित जैसे कार्यों है id()
, print()
आदि हमेशा कार्यक्रम के किसी भी हिस्से से हमारे पास उपलब्ध हैं। प्रत्येक मॉड्यूल अपना स्वयं का वैश्विक नामस्थान बनाता है।
ये विभिन्न नामस्थान अलग-थलग हैं। इसलिए, समान नाम जो अलग-अलग मॉड्यूल में मौजूद हो सकते हैं, टकराते नहीं हैं।
मॉड्यूल में विभिन्न कार्य और कक्षाएं हो सकती हैं। किसी फ़ंक्शन को कॉल करने पर एक स्थानीय नेमस्पेस बनाया जाता है, जिसमें सभी नाम परिभाषित होते हैं। ऐसा ही, क्लास के मामले में भी है। निम्नलिखित अवधारणा इस अवधारणा को स्पष्ट करने में मदद कर सकती है।

पायथन वैरिएबल स्कोप
यद्यपि विभिन्न विशिष्ट नामस्थान परिभाषित हैं, हम प्रोग्राम के हर हिस्से से उन सभी तक पहुँच प्राप्त करने में सक्षम नहीं हो सकते हैं। गुंजाइश की अवधारणा खेल में आती है।
एक स्कोप एक प्रोग्राम का वह भाग होता है जहाँ से किसी भी उपसर्ग के बिना सीधे नाम स्थान तक पहुँचा जा सकता है।
किसी भी समय, कम से कम तीन नेस्टेड स्कोप हैं।
- वर्तमान फ़ंक्शन का स्कोप जिसमें स्थानीय नाम हैं
- मॉड्यूल का स्कोप जिसमें वैश्विक नाम हैं
- आउटस्टॉस्ट स्कोप जो अंतर्निहित नामों में है
जब किसी फ़ंक्शन के अंदर एक संदर्भ बनाया जाता है, तो नाम को स्थानीय नाम स्थान में और फिर वैश्विक नामस्थान में और अंत में निर्मित नामस्थान में खोजा जाता है।
यदि किसी अन्य फ़ंक्शन के अंदर कोई फ़ंक्शन है, तो स्थानीय स्कोप के अंदर एक नया स्कोप निहित है।
पायथन में स्कोप और नेमस्पेस का उदाहरण
def outer_function(): b = 20 def inner_func(): c = 30 a = 10
यहाँ, वैरिएबल वैश्विक नामस्थान में है। चर b के स्थानीय नामस्थान में है outer_function()
और c के नेस्टेड स्थानीय नामस्थान में है inner_function()
।
जब हम अंदर होते हैं inner_function()
, तो c हमारे लिए स्थानीय है, b nonlocal है और वैश्विक है। हम c को नए मान निर्दिष्ट करने के साथ-साथ केवल b और a पढ़ सकते हैं inner_function()
।
यदि हम b के मान के रूप में असाइन करने का प्रयास करते हैं, तो स्थानीय नेमस्पेस में एक नया वैरिएबल b बनाया जाता है, जो कि नॉन-फोकल b से भिन्न होता है। एक ही बात तब होती है जब हम एक से एक मूल्य प्रदान करते हैं।
हालाँकि, यदि हम एक वैश्विक घोषित करते हैं, तो सभी संदर्भ और असाइनमेंट वैश्विक रूप से चलते हैं। इसी तरह, अगर हम वेरिएबल b को रिबंड करना चाहते हैं, तो इसे नॉनक्लॉक घोषित किया जाना चाहिए। निम्नलिखित उदाहरण इसे और स्पष्ट करेंगे।
def outer_function(): a = 20 def inner_function(): a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)
जैसा कि आप देख सकते हैं, इस कार्यक्रम का आउटपुट है
a = 30 a = 20 a = 10 है
इस कार्यक्रम में, तीन अलग-अलग चर अलग-अलग नामस्थानों में परिभाषित किए गए हैं और तदनुसार उपयोग किए जाते हैं। जबकि निम्नलिखित कार्यक्रम में,
def outer_function(): global a a = 20 def inner_function(): global a a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)
कार्यक्रम का आउटपुट है।
a = 30 a = 30 a = 30 है
यहां, सभी संदर्भ और असाइनमेंट कीवर्ड के उपयोग के कारण वैश्विक हैं global
।