1.2.31 · D5 · HinglishIntroduction to Programming (Python)

Question bankglobal and nonlocal keywords

2,188 words10 min read↑ Read in English

1.2.31 · D5 · Coding › Introduction to Programming (Python) › global and nonlocal keywords

Yeh parent topic ka ek conceptual drill hai. Yahan koi bhari computation nahi hai — har item ek misconception ya ek boundary case ko target karta hai jo assignment rule tumhare saath khelna pasand karta hai. Question padho, right side cover karo, apna jawab zor se bolo, phir reveal karo.

Traps se pehle, teen quick pictures taaki hum ek hi vocabulary share kar sakein.

Agla figure woh compile-time decision dikhata hai: compiler pehle poori body ko scan karta hai, assignment dhundhta hai, aur code ke koi bhi line run hone se pehle name par "local" ki stamp laga deta hai.


True or false — justify

Kisi global variable ko function ke andar read karne ke liye hamesha global keyword ki zaroorat hoti hai.
False. Reading LEGB ladder par automatically chadhti hai; global sirf tab chahiye jab tum name ko rebind (assign) karo.
global x aur nonlocal x "baahri taraf pahunchne" ke interchangeable tarike hain.
False. global module (top) level par jump karta hai; nonlocal nearest enclosing function se bind karta hai. Agar variable kisi enclosing function mein rehta hai, toh global use wahan nahi dhundh payega.
Agar koi function sirf ek global list par mylist.append(5) call karta hai, toh use global mylist ki zaroorat hai.
False. .append object ko mutate karta hai jis par name pehle se point kar raha hai — yeh name ko rebind nahi karta (label wahi rehta hai). Mutable vs Immutable objects dekho; koi global ki zaroorat nahi.
Kisi function ke top par global count rakhne se ek brand-new global variable create hota hai jo pehle exist nahi karta tha.
False as stated. global count akela kuch create nahi karta — yeh sirf name ko redirect karta hai. Ek global count tabhi create hota hai jab function phir count assign kare aur koi module-level count exist na karta ho. Criterion: creation ke liye global declaration aur actual assignment dono chahiye.
nonlocal x ko ek top-level (non-nested) function ke andar module variable tak pahunchne ke liye use kiya ja sakta hai.
False. nonlocal ke liye ek enclosing function chahiye jisme x ka binding ho. Top level par koi enclosing function hota hi nahi, isliye yeh SyntaxError raise karta hai.
Classic count = count + 1 example mein UnboundLocalError isliye aata hai kyunki count exist nahi karta.
False. count globally exist karta hai, lekin assignment ne count ko local bana diya, isliye local wale ki right-hand side par abhi koi value nahi hai. UnboundLocalError dekho.
global count se marked koi function ab pure function nahi raha.
True. Kisi global ko rebind karne ka matlab hai function ka shared state par ek side effect hai — output ab baahri duniya par depend karta hai aur use alter karta hai.
Tum ek hi function mein kisi name ko global aur nonlocal dono declare kar sakte ho.
False. Ek name ke liye yeh mutually exclusive intents hain; Python SyntaxError raise karta hai kyunki ek name sirf ek outer scope se bind ho sakta hai.
Python 3 mein, ek list comprehension ka apna scope hota hai, isliye baahri taraf declare kiya gaya koi global/nonlocal name comprehension ke loop variable se affect nahi hota.
True. Comprehension ka loop variable (jaise [i for i in ...] mein i) ek hidden nested scope mein rehta hai — yeh baahri nahi aata aur kisi outer i ko clobber nahi kar sakta jise tumne global ya nonlocal declare kiya ho.

Spot the error

def f():
    print(y)
    y = 10
f()
Kya toot ta hai aur kyun?
UnboundLocalError. Kyunki f mein kahin y assign kiya gaya hai, yeh poori body ke liye local hai — isliye print(y) ek aise local ko read karta hai jisme abhi koi value nahi hai.
def outer():
    def inner():
        nonlocal z
        z = 5
    inner()
outer()
Yeh kyun fail hota hai?
SyntaxError. nonlocal z ke liye zaroorat hai ki z pehle se kisi enclosing function scope mein exist kare; outer ne kabhi z define nahi kiya, isliye bind karne ke liye kuch bhi nahi hai.
total = 0
def add(n):
    total = total + n
add(3)
Ise fix karo aur batao fix kyun kaam karta hai.
Pehli line par global total add karo. total ko assign karne ne use local bana diya, isliye right-hand side ka total unbound tha; global dono sides ko module variable ki taraf point karta hai.
def make_counter():
    n = 0
    def step():
        n = n + 1
        return n
    return step
step mein bug kya hai?
n = n + 1 n ko step ka local bana deta hai, jo enclosing n ko shadow karta hai, isliye yeh ek unbound local read karta hai → UnboundLocalError. nonlocal n add karo. Closures dekho.
x = 1
def g():
    global x
    nonlocal x
    x = 2
Yeh compile kyun nahi hoga?
SyntaxError — ek single name ko global aur nonlocal dono declare nahi kiya ja sakta; dono intents conflict karte hain.
i = 99
def h():
    global i
    squares = [i for i in range(3)]
    return i
h() ke baad, module-level i kya hai?
Wahi rahega jo h ne global i ke zariye set kiya tha, comprehension se unchanged: Python 3 mein comprehension ka i apne khud ke hidden scope mein rehta hai, isliye yeh global i ko kabhi touch nahi karta (jo 99 rehta hai kyunki kuch aur assign nahi karta).

Why questions

Python locality ko run karte waqt ki jagah compile time par kyun decide karta hai?
Taaki fast, predictable bytecode compile ho sake: har name-access instruction ek baar choose ki jaati hai is basis par ki name function mein kahin assign hua hai ya nahi, har line par dobara decide nahi kiya jaata.
Kisi list ko mutate karne ke liye global kyun nahi chahiye lekin use reassign karne ke liye chahiye?
list.append us object ko change karta hai jis par name point karta hai (koi rebinding nahi — label wahi rehta hai). mylist = [...] name ko rebind karta hai, jo ek local create kar deta jab tak global kuch aur na kahe.
global sirf module level tak kyun pahunchta hai aur kisi enclosing function tak nahi?
global ko "seedha LEGB ke G par skip karo" ke roop mein design kiya gaya tha. Enclosing-function scope E level hai — ek alag rung — isliye nonlocal exist karta hai.
Closure ka n returned function ke calls ke beech survive kyun karta hai?
Returned inner function apne enclosing scope ka reference rakhta hai (ek closure), isliye make_counter ke return hone par n destroy nahi hota — woh zinda rehta hai (figure s05 dekho). Closures refer karo.
global ko zyada use karna bad style kyun maana jaata hai?
Yeh hidden side effects aur shared mutable state create karta hai, jo functions ko test karna, samajhna aur reuse karna mushkil bana deta hai — koi bhi caller invisibly affect ho sakta hai.
print(count) bina global ke kyun kaam karta hai lekin count += 1 nahi karta?
print(count) pure reading hai (LEGB climb karta hai). count += 1 expand hota hai count = count + 1 mein, jo ek assignment (rebinding) hai → "use local banao" rule trigger karta hai.
Python 3 mein list comprehension ka loop variable surrounding function mein kyun nahi leak karta?
Kyunki ek comprehension ko apna khud ka nested scope milta hai (Python 2 ke unlike), isliye uska loop name us mini-scope ka local hai aur kisi outer name ko kabhi rebind nahi karta — isliye baahri taraf declare kiya gaya global/nonlocal safe rehta hai.

Edge cases

Agar koi global variable har function mein sirf read hi hota hai, toh kya tumhe kabhi global chahiye?
Nahi. Pure reading hamesha baahri taraf chadhti hai; global sirf name ko rebind karne ke liye hai.
Agar tum global x karo kisi aise name ke liye jo module level par exist nahi karta, phir use assign karo, toh kya hoga?
Assignment module level par x create kar deta hai — call ke baad, x globally exist karta hai.
Ek nested function kisi enclosing variable ko read karta hai (kabhi assign nahi). Kya use nonlocal chahiye?
Nahi. Reading use LEGB ke E level ke zariye automatically dhundh leti hai; nonlocal sirf rebinding ke liye hai.
Same level par do nested functions dono nonlocal n karte hain. Woh kis n se bind hote hain?
Apne common enclosing function mein same n se — dono ek shared variable ko rebind karte hain, isliye woh uske zariye communicate kar sakte hain.
nonlocal ke saath do enclosing functions dono x hold karte hain — kaun jeetha hai?
Nearest enclosing function ka x. nonlocal closest enclosing scope se bind karta hai jisme woh name ho.
Kya global ko kisi nested function ke andar module variable tak pahunchne ke liye use kiya ja sakta hai, enclosing wale ko skip karte hue?
Haan. global x hamesha module top level ko target karta hai, kisi bhi enclosing-function x ko puri tarah jump karke.
Agar tum global x declare karo lekin function mein kabhi x assign na karo, toh kya kuch change hota hai?
Behaviourally kuch observable nahi — reads global tak pehle hi pahunch jaate hain. Yeh ek redundant declaration hai, though koi error nahi.
Kisi function ke andar comprehension ko apni expression mein koi enclosing variable read karne ke liye nonlocal chahiye?
Nahi. Comprehension outer names ko LEGB ke zariye read kar sakta hai bilkul kisi bhi nested scope ki tarah; use apna scope sirf loop variable ke liye milta hai, un names ke liye nahi jinhe woh sirf read karta hai.

Connections

  • Scope and LEGB rule
  • Functions in Python
  • Closures
  • Mutable vs Immutable objects
  • UnboundLocalError
  • Pure functions and side effects