Python Namespace और Variable Scope
Namespace Scope को Implement करने का एक तरीका है। Python में, प्रत्येक Package, Module, Class, Function और Method Function का अपना एक "Namespace" होता है जिसमें Variable Names Resolve होते हैं। जब कोई Function, Module या Package Evaluate होता है (यानी Execution शुरू होता है), तो एक Namespace Create होता है। इसे "Evaluation Context" के रूप में सोचें। जब कोई Function, आदि, Execution समाप्त करता है, तो Namespace Drop हो जाता है। Variables Drop हो जाते हैं। साथ ही एक Global Namespace होता है जिसका उपयोग तब किया जाता है जब Name Local Namespace में नहीं होता।
प्रत्येक Variable Name को पहले Local Namespace (Function का Body, Module, आदि) में Check किया जाता है, और फिर Global Namespace में Check किया जाता है।
Variables आमतौर पर केवल Local Namespace में Create किए जाते हैं। global और nonlocal Statements Variables को Local Namespace के अलावा अन्य Namespaces में Create कर सकते हैं।
Scope Resolution तब आवश्यक होता है जब किसी Variable का उपयोग यह Determine करने के लिए किया जाता है कि इसका Value कहां से आना चाहिए। Python में Scope Resolution **LEGB Rule** का पालन करता है।
LEGB Rule:
- L - Local: Function (या Lambda) के भीतर किसी भी तरह से Assign किए गए Names, और उस Function में Global Declare नहीं किए गए
- E - Enclosing-function Locals: किसी भी और सभी Statically Enclosing Functions (या Lambdas) के Local Scope में Name, Inner से Outer की ओर
- G - Global (Module): Module File के Top-Level पर Assign किए गए Names, या File के भीतर Def में Global Statement Execute करके
- B - Built-in (Python): Built-in Names Module में Pre-assigned Names:
open,range,SyntaxError, आदि
उदाहरण: LEGB Demonstration
# Built-in (B)
print(len("hello")) # 5 - Built-in function
# Global (G)
x = 10
def outer():
# Enclosing (E)
x = 20
def inner():
# Local (L)
x = 30
print(f"Local x: {x}") # 30
print(f"Enclosing x: {x}") # 30 (Local shadows enclosing)
inner()
print(f"Enclosing x after inner: {x}") # 20
outer()
print(f"Global x: {x}") # 10
global और nonlocal Keywords:
x = 10 # Global
def modify_global():
global x
x = 20 # Global x को Modify करता है
def outer():
x = 100 # Enclosing
def inner():
nonlocal x # Enclosing x को Refer करता है
x = 200
inner()
print(x) # 200 - Enclosing Modified!
modify_global()
print(x) # 20 - Global Modified!