⚠ यह कार्रवाई अनुमति नहीं है!
🐍 NIELIT O Level · M3-R5 Python · Hindi Notes

Chapter 8: Scope and Modules — Variable कहाँ जीता है, Code कैसे Organize होता है

Python किसी नाम को कैसे ढूँढता है (LEGB Rule), nonlocal keyword की गहराई, हर Module का अपना Namespace, Python का पूरा Import Model (sys.path, sys.modules) और Module Reloading — सब diagrams के साथ!

📑 11 Sections 🖼️ 3 Diagrams 💻 35+ Examples ❓ 50 MCQs + Output Qs 🗓 Updated 2026
👉 सभी chapters देखने के लिए swipe करें
📑 Table of Contents — किसी भी topic पर सीधे जाएँ
8.0

Scope क्या है? — Variable का घर व उम्र

Chapter 6 में हमने Local व Global variables की बुनियाद देखी थी — अब पूरी theory समझते हैं। Scope = variable कहाँ accessible है; Lifetime = variable memory में कब तक रहता है।
🐍 Scope व Lifetime — एक साथ देखिए▶ Run
def show():
    x = 100        # yah variable yahi "paida" hota hai
    print("Andar:", x)

show()
# function khatm hote hi x memory se GAYAB!
# print(x)  # NameError aayegi
OUTPUTAndar: 100
Exam Point: Variable का lifetime उसके scope खत्म होते ही समाप्त हो जाता है — function लौटते ही local variables memory से हट जाते हैं।
8.1

LEGB Rule — Python किस क्रम में नाम ढूँढता है

LEGB = Local → Enclosing → Global → Built-in। Python किसी नाम को इसी क्रम में ढूँढता है — जहाँ पहले मिल जाए, वहीं रुक जाता है!

LEGB — घोंसले के अंदर घोंसला (सबसे अंदर पहले खोजा जाता है)

4️⃣ B — Built-in (Python का अपना — len, print...) 3️⃣ G — Global (पूरी file में) 2️⃣ E — Enclosing (outer function) 1️⃣ L — Local (सबसे पहले यहाँ खोजा जाता है!) यहाँ नाम मिला तो Python बाहर देखने ही नहीं जाता
🐍 LEGB का Live Demo — 4 Levels एक साथ▶ Run
x = "Global X"          # G

def outer():
    x = "Enclosing X"    # E
    def inner():
        x = "Local X"    # L
        print(x)         # sabse pehle YAHI milega
    inner()

outer()
print(len("Python"))     # B — built-in function
OUTPUTLocal X
6
समझें: inner() में x को खोजते ही Python सबसे पहले Local scope देखता है — वहीं "Local X" मिल गया, इसलिए Enclosing या Global तक जाने की ज़रूरत नहीं पड़ी!
🐍 अगर Local में न मिले — अगले level पर जाता है▶ Run
def outer():
    message = "Hello from outer"   # Enclosing ke liye

    def inner():
        print(message)   # Local me nahi mila -> Enclosing me dekha
    inner()

outer()
OUTPUTHello from outer
Exam Point: LEGB क्रम = Local → Enclosing → Global → Built-in। जहाँ पहले नाम मिले, वहीं रुक जाता है (बाकी levels check नहीं होते)। किसी level में न मिलने पर NameError आती है।
8.2

global व nonlocal Keywords — बाहर का Variable बदलना

सिर्फ पढ़ने के लिए keyword नहीं चाहिए — पर modify करना हो तो! global = module-level variable बदलना; nonlocal = enclosing (outer function का) variable बदलना।
🐍 global — Module-level Variable Modify करना▶ Run
x = 50

def update():
    global x
    x = 200
    print("Andar:", x)

update()
print("Bahar:", x)
OUTPUTAndar: 200
Bahar: 200
🐍 nonlocal — Outer Function का Variable Modify करना▶ Run
def outer():
    x = "outer value"

    def inner():
        nonlocal x       # global nahi, outer function ka x
        x = "modified by inner"
        print("Inner:", x)

    inner()
    print("Outer:", x)    # yah bhi badal gaya!

outer()
OUTPUTInner: modified by inner
Outer: modified by inner

⚖️ global vs nonlocal — पूरी तुलना

आधारglobalnonlocal
किसे target करता हैसबसे बाहरी (module-level) variableबीच वाले outer function का variable
कहाँ उपयोगकिसी भी function के अंदरसिर्फ nested (अंदर के) function में
बिना keywordUnboundLocalErrorUnboundLocalError
Exam Point: global = module-level तक पहुँच; nonlocal = सिर्फ nested function से बीच वाले outer तक पहुँच (Global तक नहीं जा सकता)। दोनों के बिना modify करने पर UnboundLocalError।
8.3

Modules क्या हैं? — हर .py File एक Module है

Chapter 6 में हमने math, random जैसे built-in modules उपयोग किए थे — Module सीधा-सीधा एक .py file है जिसमें functions/variables हों, जिसे import करके दूसरी files में उपयोग किया जा सके।
🐍 अपना खुद का Module — mymodule.py▶ Run
# file: mymodule.py
def greet(name):
    print("Namaste,", name)

x = 100
🐍 दूसरी file से Import करना — main.py▶ Run
import mymodule

mymodule.greet("Aditya")
print("x =", mymodule.x)
OUTPUTNamaste, Aditya
x = 100

📦 Import के 3 तरीके (Chapter 6 का recap + विस्तार)

🐍 पूरा module vs specific vs सब कुछ (*)▶ Run
import mymodule                    # poora module — prefix zaroori
from mymodule import greet, x      # sirf selected members
from mymodule import *             # sab kuch (⚠ avoid — conflicts ho sakte hain)

🎯 __name__ == "__main__" — बहुत Important Pattern

🐍 File direct चली या import हुई — कैसे पता?▶ Run
# file: demo.py
def show():
    print("Inside demo module")

if __name__ == "__main__":
    print("Yah file directly chal rahi hai")
else:
    print("Yah kisi aur file me import hui hai")
OUTPUT (direct run पर)Yah file directly chal rahi hai
समझें: जब आप python demo.py से direct चलाते हैं — __name__ = "__main__"। जब कोई और file import demo करती है — __name__ = "demo"। इसी check से हम decide करते हैं कि कोड सिर्फ direct-run होने पर चले, import होने पर नहीं।
Exam Point: Module = .py file जिसे import किया जा सके। from...import * avoid करें (namespace conflicts)। __name__ == "__main__" test module व script दोनों तरह उपयोगी बनाने की trick है।
8.4

Modules as Namespaces — हर Module का अपना कमरा

Namespace = names व उनकी values का mapping (एक dictionary जैसा)। हर module का अपना अलग namespace होता है — इसीलिए दो अलग modules में same नाम के variable बिना टकराए रह सकते हैं!

दो Modules — Same नाम, अलग Namespace, कोई टकराव नहीं

📦 mod1.py x = 10 mod1.x → 10 📦 mod2.py x = 50 mod2.x → 50 दोनों "x" — पर अलग namespace होने से कोई टकराव नहीं!
🐍 Same नाम, अलग Modules — बिना Conflict▶ Run
# mod1.py: x = 10
# mod2.py: x = 50

import mod1
import mod2

print(mod1.x)   # 10
print(mod2.x)   # 50 — koi confusion nahi!
OUTPUT10
50
🐍 dir() से module का पूरा namespace देखना▶ Run
import math
print(dir(math)[:5])   # pehle 5 names dekhte hain
OUTPUT['__doc__', '__loader__', '__name__', '__package__', '__spec__']
Exam Point: Namespace = names का map (dictionary जैसा)। हर module का अपना independent namespace। dir(module) से सारे names की list; module.__dict__ से namespace को dictionary रूप में देख सकते हैं।
8.5

Import Model — import लिखते ही अंदर क्या होता है?

जब आप import module_name लिखते हैं, Python एक पूरा internal process चलाता है — यह देखिए step-by-step।

Import Process — import लिखने से module तैयार होने तक

import math लिखा sys.modules में पहले से है? हाँ → वही उपयोग नहीं → sys.path खोजो .pyc में Compile Memory में Load sys.modules में register
🐍 sys.path — Python कहाँ-कहाँ modules खोजता है▶ Run
import sys
print(sys.path[0])   # pehla search path (aksar current directory)
print(len(sys.path))  # kitne paths hain
🐍 sys.modules — पहले से loaded modules की registry▶ Run
import sys
import math

print("math" in sys.modules)   # True — pehle se load ho chuka
import math                     # DOBARA import — file dobara nahi padhi jaati
print("Fast! Cached version use hua")
OUTPUTTrue
Fast! Cached version use hua
🐍 Module न मिलने पर Error Handle करना▶ Run
try:
    import unknown_module
except ModuleNotFoundError:
    print("Module nahi mila!")
OUTPUTModule nahi mila!
Exam Point: Import steps — sys.modules check → sys.path search → .pyc compile → memory load → sys.modules register। दोबारा import करने पर cached version उपयोग होता है (fast!)। Module न मिलने पर ModuleNotFoundError।
8.6

Module Reloading — बिना Restart किए Update लाना

Normal import module को सिर्फ पहली बार load करता है — दोबारा import करने पर पुराना cached version ही मिलता है। Module file में बदलाव के बाद नया version लाने के लिए importlib.reload() उपयोग करते हैं।
🐍 importlib.reload() — Live Update▶ Run
import mymodule
mymodule.greet()   # "Hello from Version 1"

# ...ab mymodule.py file me badlaav kiya gaya...
# def greet(): print("Hello from Version 2")

import importlib
importlib.reload(mymodule)
mymodule.greet()   # "Hello from Version 2" — naya code aa gaya!
OUTPUTHello from Version 1
Hello from Version 2

⚠️ कब उपयोगी है, कब सावधानी बरतें

  • ✅ Jupyter/IDLE जैसे long-running sessions में testing के दौरान।
  • ✅ किसी module file में change करने के बाद बिना restart किए test करना।
  • ⚠️ Reload से पुराने global variables reset हो सकते हैं — सावधानी से उपयोग करें।
Exam Point: importlib.reload(module) — बिना interpreter restart किए module को refresh करता है। Normal import सिर्फ पहली बार file पढ़ता है — दोबारा import करने पर सिर्फ cache से उपयोग होता है (reload नहीं होता)।
8.7

🎯 Output-Based Questions — Scope व Modules के Tricky सवाल

LEGB व global/nonlocal के questions confuse करते हैं — पहले खुद सोचिए!

Q1. LEGB — Local जीतता है

🐍 Output बताइए▶ Run
x = "global"
def f():
    x = "local"
    print(x)
f()
print(x)
ANSWERlocal
global
← function के अंदर local x जीता; बाहर global x वैसा ही रहा।

Q2. Enclosing Scope Access

🐍 Output बताइए▶ Run
def outer():
    y = "outer y"
    def inner():
        print(y)     # local me nahi, enclosing me hai
    inner()
outer()
ANSWERouter y
← inner में y नहीं है — Python Enclosing scope में देखकर मिल गया।

Q3. global Keyword का असर

🐍 Output बताइए▶ Run
count = 5
def inc():
    global count
    count += 1
inc()
inc()
print(count)
ANSWER7
← दोनों calls में global count असली बदला — 5→6→7।

Q4. nonlocal बनाम बिना keyword

🐍 Output बताइए▶ Run
def outer():
    n = 10
    def inner():
        n = 20     # nonlocal NAHI hai — yah NAYA local n hai
        print("Inner:", n)
    inner()
    print("Outer:", n)
outer()
ANSWERInner: 20
Outer: 10
← nonlocal न होने से inner का n बिल्कुल अलग local variable है — outer वाला अछूता रहा।

Q5. Module Namespace — कोई Conflict नहीं

🐍 mod1.py: x=1, mod2.py: x=2 — Output?▶ Run
import mod1, mod2
print(mod1.x + mod2.x)
ANSWER3
← दोनों x अलग namespace में — mod1.x=1, mod2.x=2, sum=3।

Q6. __name__ Check

🐍 इस file को direct चलाने पर Output?▶ Run
if __name__ == "__main__":
    print("Direct run")
else:
    print("Imported")
ANSWERDirect run
← Directly चलाने पर __name__ हमेशा "__main__" होता है।
8.8

💻 Practice Programs — Scope व Modules के असली उपयोग

हर program scope या module concepts पर — practical व theory दोनों में उपयोगी।

Program 1 — Counter (global keyword का practical उपयोग)

🐍 visitor_counter.py▶ Run
visitors = 0

def new_visitor():
    global visitors
    visitors += 1
    print(f"Visitor #{visitors} aaya!")

new_visitor()
new_visitor()
new_visitor()
print("Total visitors:", visitors)
OUTPUTVisitor #1 aaya!
Visitor #2 aaya!
Visitor #3 aaya!
Total visitors: 3

Program 2 — Counter Generator (nonlocal से closure)

🐍 counter_maker.py — हर call पर बढ़ने वाला counter▶ Run
def make_counter():
    count = 0
    def counter():
        nonlocal count
        count += 1
        return count
    return counter

my_counter = make_counter()
print(my_counter())
print(my_counter())
print(my_counter())
OUTPUT1
2
3

Program 3 — अपना Utility Module बनाना

🐍 shape_utils.py — फिर उसे उपयोग करना▶ Run
# File: shape_utils.py
def rectangle_area(l, w):
    return l * w

def circle_area(r):
    return 3.14159 * r * r

if __name__ == "__main__":
    print("Testing shape_utils directly")

# File: main.py
import shape_utils
print(shape_utils.rectangle_area(5, 3))
print(shape_utils.circle_area(4))
OUTPUT15
50.26544

Program 4 — Module से Available Functions देखना

🐍 module_explorer.py▶ Run
import random

functions = [name for name in dir(random) if not name.startswith("_")]
print("Total public functions:", len(functions))
print("Kuch functions:", functions[:5])
OUTPUTTotal public functions: 60+
Kuch functions: ['BPF', 'LOG4', 'NV_MAGICCONST', ...]
Exam Point: global से shared state (जैसे counter) modify करना; nonlocal से closures बनाना (make_counter जैसा pattern); __name__ == "__main__" से module को dual-purpose (standalone व importable) बनाना।
8.9

Summary — Quick Revision (Exam से पहले पढ़ें)

  • Scope = variable कहाँ accessible; Lifetime = कब तक memory में रहता है।
  • LEGB Rule: Local → Enclosing → Global → Built-in — इसी क्रम में Python नाम ढूँढता है, जहाँ मिले वहीं रुक जाता है।
  • global keyword — module-level variable को function के अंदर से modify करने के लिए; nonlocal — outer (enclosing) function के variable को nested function से modify करने के लिए।
  • Module = .py file जिसे import करके उपयोग करें; import module, from module import x, import module as alias — 3 तरीके।
  • __name__ == "__main__" — बताता है file direct चली या import हुई; module को dual-purpose बनाने की trick।
  • Namespace = names का mapping; हर module का अपना independent namespace — same नाम के variable दो modules में बिना conflict के रह सकते हैं।
  • Import process: sys.modules check → sys.path search → .pyc compile → memory load → sys.modules register। दोबारा import cached version उपयोग करता है।
  • Module Reloading: importlib.reload(module) — बिना restart किए updated code लाने के लिए।
8.10

Model Questions — 50 MCQs + 15 Theory Questions

❓ A. Multiple Choice Questions (50)

#प्रश्न
1

LEGB का पूरा नाम है —

(a) Local Enclosing Global Built-in(b) Local Extended Global Basic(c) Level Encoding General Basic(d) Local Enclosed Generic Built-in
✔ सही उत्तर: (a) Local Enclosing Global Built-inPython variable search का क्रम।
2

LEGB में सबसे पहले कौन-सा scope check होता है?

(a) Global(b) Built-in(c) Local(d) Enclosing
✔ सही उत्तर: (c) Localसबसे अंदर वाला scope पहले।
3

LEGB में सबसे आखिर में कौन-सा scope check होता है?

(a) Local(b) Enclosing(c) Global(d) Built-in
✔ सही उत्तर: (d) Built-inlen(), print() जैसे predefined names।
4

Nested function में outer function का scope कहलाता है —

(a) Local(b) Enclosing(c) Global(d) Built-in
✔ सही उत्तर: (b) Enclosing
5

किसी scope में नाम न मिले तो Python क्या करता है?

(a) 0 return करता है(b) अगले scope में खोजता है(c) None return करता है(d) Program रुक जाता है
✔ सही उत्तर: (b) अगले scope में खोजता हैसभी scopes में न मिले तो NameError।
6

Module-level variable modify करने वाला keyword —

(a) local(b) global(c) nonlocal(d) static
✔ सही उत्तर: (b) global
7

Nested function से outer function का variable modify करने वाला keyword —

(a) global(b) nonlocal(c) outer(d) enclosing
✔ सही उत्तर: (b) nonlocal
8

global keyword के बिना variable modify करने पर आती है —

(a) SyntaxError(b) UnboundLocalError(c) TypeError(d) कोई error नहीं
✔ सही उत्तर: (b) UnboundLocalError
9

nonlocal keyword किस scope तक पहुँच सकता है?

(a) सीधे Global तक(b) सिर्फ enclosing (outer) function तक(c) Built-in तक(d) कहीं नहीं
✔ सही उत्तर: (b) सिर्फ enclosing (outer) function तकGlobal तक जाने के लिए global keyword चाहिए।
10

Local व Global variable same नाम के हों तो function के अंदर कौन प्राथमिकता पाता है?

(a) Global(b) Local(c) दोनों merge(d) Error
✔ सही उत्तर: (b) Local
11

Module क्या है?

(a) एक function(b) .py file जिसमें code हो(c) एक variable(d) एक loop
✔ सही उत्तर: (b) .py file जिसमें code हो
12

Module import करने का सही तरीका —

(a) include module(b) import module(c) load module(d) using module
✔ सही उत्तर: (b) import module
13

Module को alias देने का keyword —

(a) rename(b) as(c) alias(d) named
✔ सही उत्तर: (b) asimport module as alias।
14

from module import * क्यों avoid करना चाहिए?

(a) Slow होता है(b) Namespace conflicts हो सकते हैं(c) Error देता है हमेशा(d) कोई कारण नहीं
✔ सही उत्तर: (b) Namespace conflicts हो सकते हैं
15

File को direct चलाने पर __name__ की value —

(a) module का नाम(b) "__main__"(c) खाली string(d) None
✔ सही उत्तर: (b) "__main__"
16

Module को import करने पर उसके अंदर __name__ की value —

(a) "__main__"(b) module का नाम(c) खाली string(d) None
✔ सही उत्तर: (b) module का नाम
17

Namespace क्या है?

(a) एक loop(b) names व उनकी values का mapping(c) एक function(d) एक operator
✔ सही उत्तर: (b) names व उनकी values का mapping
18

दो अलग modules में same नाम के variable होने पर —

(a) Error आती है(b) कोई conflict नहीं (अलग namespace)(c) दोनों merge हो जाते हैं(d) Program crash होता है
✔ सही उत्तर: (b) कोई conflict नहीं
19

Module के सारे names देखने का function —

(a) list()(b) dir()(c) show()(d) names()
✔ सही उत्तर: (b) dir()dir(module_name)।
20

Module का namespace dictionary रूप में देखने वाला attribute —

(a) __dict__(b) __name__(c) __doc__(d) __file__
✔ सही उत्तर: (a) __dict__
21

Import करने पर Python सबसे पहले क्या check करता है?

(a) sys.path(b) sys.modules (पहले से loaded?)(c) file size(d) internet connection
✔ सही उत्तर: (b) sys.modules
22

sys.path क्या है?

(a) Loaded modules की list(b) Module search directories की list(c) Error messages की list(d) Function names की list
✔ सही उत्तर: (b) Module search directories की list
23

sys.modules क्या है?

(a) Search paths की list(b) पहले से loaded modules की dictionary(c) Error codes(d) Function list
✔ सही उत्तर: (b) पहले से loaded modules की dictionary
24

Module को compile करके किस format में बदला जाता है?

(a) .exe(b) .pyc (bytecode)(c) .txt(d) .html
✔ सही उत्तर: (b) .pyc (bytecode)
25

.pyc files कहाँ store होती हैं?

(a) sys folder(b) __pycache__ folder(c) root directory(d) कहीं नहीं
✔ सही उत्तर: (b) __pycache__ folder
26

Module दोबारा import करने पर क्या होता है?

(a) फिर से पूरी file पढ़ी जाती है(b) Cached version (sys.modules से) उपयोग होता है(c) Error आती है(d) Module delete हो जाता है
✔ सही उत्तर: (b) Cached version उपयोग होता हैइसीलिए दोबारा import तेज़ होता है।
27

Module न मिलने पर आने वाली exception —

(a) FileNotFoundError(b) ModuleNotFoundError(c) ImportError only(d) ValueError
✔ सही उत्तर: (b) ModuleNotFoundError
28

Module को reload करने के लिए function —

(a) reload()(b) importlib.reload()(c) refresh()(d) update()
✔ सही उत्तर: (b) importlib.reload()
29

importlib.reload() क्यों उपयोग होता है?

(a) Module delete करने के लिए(b) बिना restart किए updated code लाने के लिए(c) Module का नाम बदलने के लिए(d) Error रोकने के लिए
✔ सही उत्तर: (b) बिना restart किए updated code लाने के लिए
30

Normal import दोबारा करने पर module reload होता है क्या?

(a) हाँ, हमेशा(b) नहीं, cached version उपयोग होता है(c) सिर्फ पहली बार(d) Random
✔ सही उत्तर: (b) नहीं, cached version उपयोग होता है
31

x = 10; def f(): print(x) — Output?

(a) 10(b) Error(c) None(d) 0
✔ सही उत्तर: (a) 10बिना modify किए global variable पढ़ने में कोई keyword नहीं चाहिए।
32

Local scope का lifetime कब खत्म होता है?

(a) Program शुरू होते ही(b) Function समाप्त होते ही(c) कभी नहीं(d) File save होते ही
✔ सही उत्तर: (b) Function समाप्त होते ही
33

Built-in scope में क्या आता है?

(a) User की बनाई functions(b) len(), print() जैसे Python predefined names(c) Global variables(d) Local variables
✔ सही उत्तर: (b) len(), print() जैसे predefined names
34

globals() function क्या return करता है?

(a) सभी local variables(b) सभी global variables (dictionary)(c) सिर्फ functions(d) कुछ नहीं
✔ सही उत्तर: (b) सभी global variables (dictionary)
35

locals() function क्या return करता है?

(a) Current scope के local variables(b) Global variables(c) Built-in functions(d) File names
✔ सही उत्तर: (a) Current scope के local variables
36

from math import sqrt करने के बाद उपयोग —

(a) math.sqrt(16)(b) sqrt(16)(c) sqrt.math(16)(d) import.sqrt(16)
✔ सही उत्तर: (b) sqrt(16)Prefix की ज़रूरत नहीं।
37

import math as m के बाद उपयोग —

(a) math.sqrt()(b) m.sqrt()(c) sqrt()(d) as.sqrt()
✔ सही उत्तर: (b) m.sqrt()
38

Custom module (mymodule.py) import करने का तरीका —

(a) import mymodule.py(b) import mymodule(c) load mymodule(d) include mymodule
✔ सही उत्तर: (b) import mymoduleबिना .py extension के।
39

Enclosing scope तभी होता है जब —

(a) कोई भी function हो(b) Function nested (function के अंदर function) हो(c) Module import हो(d) Loop चल रहा हो
✔ सही उत्तर: (b) Function nested हो
40

nonlocal keyword बिना enclosing function के उपयोग करने पर —

(a) SyntaxError(b) कुछ नहीं होता(c) global जैसा काम करता है(d) TypeError
✔ सही उत्तर: (a) SyntaxErrornonlocal सिर्फ nested function में valid है।
41

Module में documentation string access करने के लिए —

(a) module.__name__(b) module.__doc__(c) module.__file__(d) module.__init__
✔ सही उत्तर: (b) module.__doc__
42

Built-in module का उदाहरण —

(a) mymodule(b) math(c) shape_utils(d) userfile
✔ सही उत्तर: (b) mathPython के साथ पहले से आता है।
43

Python interpreter modules किस order में खोजता है?

(a) Random order(b) Current directory → PYTHONPATH → Standard library(c) सिर्फ standard library(d) सिर्फ current directory
✔ सही उत्तर: (b) Current directory → PYTHONPATH → Standard library
44

Closure (जैसे make_counter उदाहरण) में क्या उपयोग होता है?

(a) global(b) nonlocal(c) static(d) local
✔ सही उत्तर: (b) nonlocalInner function outer की value याद रखता व बदलता है।
45

दो बार global x += 1 करने पर x का increase —

(a) 1(b) 2(c) 0(d) निर्भर करता है
✔ सही उत्तर: (b) 2हर call से 1 बढ़ता है, दो calls = 2 बार।
46

Module import होते समय उसका top-level code —

(a) कभी नहीं चलता(b) एक बार चलता है(c) हर बार import पर चलता है(d) सिर्फ error पर चलता है
✔ सही उत्तर: (b) एक बार चलता हैपहले import पर; बाद में cache से।
47

Function के lifetime का संबंध किससे है?

(a) File के नाम से(b) Function के call व return से(c) Variable के type से(d) Module के नाम से
✔ सही उत्तर: (b) Function के call व return से
48

Scope resolution की गलती से आने वाली आम error —

(a) SyntaxError(b) NameError(c) IndexError(d) TypeError
✔ सही उत्तर: (b) NameErrorसभी LEGB scopes में न मिलने पर।
49

Module reload करने पर पुराने global variables का क्या होता है?

(a) हमेशा सुरक्षित रहते हैं(b) Reset हो सकते हैं(c) Delete हो जाते हैं हमेशा(d) कोई असर नहीं
✔ सही उत्तर: (b) Reset हो सकते हैंइसीलिए reload सावधानी से उपयोग करें।
50

Modules व Namespaces की सबसे बड़ी उपयोगिता —

(a) Program को धीमा बनाना(b) Code organize करना व naming conflicts से बचाना(c) Memory बढ़ाना(d) Syntax कठिन बनाना
✔ सही उत्तर: (b) Code organize करना व naming conflicts से बचाना

📝 B. 15 Theory Questions (Short Answers)

  1. Scope व Lifetime में अंतर बताइए।Scope बताता है variable कहाँ accessible है (कौन-से हिस्से में); Lifetime बताता है variable memory में कब तक रहता है — दोनों जुड़े हैं पर अलग concept हैं।
  2. LEGB Rule क्या है? पूरा क्रम लिखिए।Python किसी नाम को खोजने का क्रम — Local (function के अंदर) → Enclosing (outer function) → Global (module-level) → Built-in (Python predefined)। जहाँ पहले मिले, वहीं रुक जाता है।
  3. global keyword की ज़रूरत कब पड़ती है?जब function के अंदर किसी module-level (global) variable की value बदलनी हो — बिना global keyword के Python उसे नया local variable मान लेता है और UnboundLocalError देता है।
  4. nonlocal keyword क्या करता है? global से कैसे अलग है?nonlocal nested function से outer (enclosing) function के variable को modify करने देता है — सिर्फ बीच वाले scope तक पहुँचता है, module-level तक नहीं (वहाँ तक global चाहिए)।
  5. Module क्या है? उदाहरण दीजिए।Module एक .py file है जिसमें functions, variables, classes हों — इसे import करके दूसरी files में उपयोग किया जा सकता है। उदाहरण: math, random, या खुद बनाई mymodule.py।
  6. Import के 3 तरीके लिखिए।import module_name (पूरा module, prefix चाहिए); from module_name import x (specific member, prefix नहीं चाहिए); import module_name as alias (छोटा नाम)।
  7. __name__ == "__main__" पैटर्न क्यों उपयोगी है?यह बताता है कि file directly चलाई गई है या किसी और file में import हुई है। इस check से एक ही file को standalone script व reusable module दोनों तरह उपयोग कर सकते हैं।
  8. Namespace क्या है?Names व उनकी values (objects) का mapping — एक dictionary जैसा। हर module, function का अपना namespace होता है, जिससे same नाम के variables बिना टकराए रह सकते हैं।
  9. दो modules में same नाम के variable हों तो क्या होगा?कोई conflict नहीं होगा क्योंकि हर module का अपना independent namespace है — उन्हें module_name.variable_name से अलग-अलग access करते हैं (जैसे mod1.x और mod2.x)।
  10. dir() function का उपयोग समझाइए।dir(module_name) module में मौजूद सभी names (functions, variables, classes) की list देता है — किसी भी module को explore करने का तरीका।
  11. Import होने पर Python अंदर क्या steps करता है?पहले sys.modules में check (पहले से loaded?) → नहीं तो sys.path directories में search → module मिलने पर .pyc bytecode में compile → memory में load → sys.modules में register।
  12. sys.path और sys.modules में अंतर बताइए।sys.path — directories की list जहाँ Python modules खोजता है (search paths)। sys.modules — पहले से load हो चुके modules की dictionary (cache)।
  13. Module reloading क्यों ज़रूरी होती है? कैसे करते हैं?Development/testing के दौरान module file में बदलाव के बाद updated code लाने के लिए — बिना Python restart किए। importlib.reload(module_name) से।
  14. globals() और locals() function क्या करते हैं?globals() current module के सभी global variables को dictionary में देता है; locals() current function के local variables dictionary में देता है — दोनों debugging में उपयोगी।
  15. Same function नाम दो modules में हो तो कैसे handle करते हैं?दोनों modules import करके module_name.function_name() से अलग-अलग call करते हैं — जैसे greet1.hello() और greet2.hello() — namespace अलग होने से कोई टकराव नहीं होता।
Revision Tip: LEGB का क्रम, global vs nonlocal का target scope, __name__ == "__main__" की trick, और namespace की वजह से conflict न होना — ये 4 areas हर exam में सबसे ज़्यादा पूछे जाते हैं। Section 8.7 के output questions ज़रूर दोहराएँ!
FAQ

अक्सर पूछे जाने वाले प्रश्न

LEGB Rule क्या है?
LEGB का मतलब Local, Enclosing, Global, Built-in — यह वह क्रम है जिसमें Python किसी variable को ढूँढता है। पहले function के अंदर (Local), फिर outer function में (Enclosing), फिर पूरी file में (Global), और आखिर में Python के predefined names में (Built-in)।
global और nonlocal keyword में क्या अंतर है?
global keyword function के अंदर से module-level (सबसे बाहरी) variable को modify करने के लिए उपयोग होता है। nonlocal keyword nested function में outer (enclosing) function के variable को modify करने के लिए — दोनों अलग scope को target करते हैं।
Module और Namespace में क्या संबंध है?
हर Python module (.py file) का अपना अलग namespace होता है — उसके variables, functions module.name के रूप में access होते हैं। इसीलिए दो अलग modules में same नाम के variable बिना conflict के रह सकते हैं।
import करने पर Python अंदर क्या करता है?
पहले sys.modules में check करता है कि module पहले से loaded है या नहीं; अगर नहीं तो sys.path की directories में module को खोजता है, फिर उसे bytecode (.pyc) में compile करके memory में load करता है और sys.modules में register कर देता है।
Module को reload कैसे करते हैं?
importlib.reload(module_name) से — यह module को फिर से file से load करता है ताकि किए गए बदलाव बिना Python restart किए दिख सकें। Normal import दूसरी बार module को दोबारा load नहीं करता (cached version उपयोग होता है)।

🎯 Chapter 8 पूरा हुआ! अब आगे बढ़ें

Chapter 9 में NumPy Basics — arrays, vectorized operations व Data Science की पहली सीढ़ी।

Chapter 9 पढ़ें ➜