حوزه دسترسی (Scope)
«حوزه دسترسی (Scope)» یعنی هر متغیر کجا دیده می شود. در پایتون، جای ساختن متغیر مهم است. بنابراین رفتار برنامه تغییر می کند. این مفهوم را ساده و مدرسه ای جلو می بریم.
تعریف حوزه دسترسی در پایتون
هر متغیر فقط در همان محدوده ساخت خودش قابل استفاده است. به این محدوده می گوییم «حوزه دسترسی». اگر گسترده باشد، به آن «سراسری (Global)» می گوییم.
حوزه محلی (Local Scope)
متغیر داخل تابع، فقط همان جا دیده می شود. بیرونش خطا می شود.
def myfunc():
x = 300
print(x)
myfunc()
تابع داخل تابع
تابع داخلی می تواند متغیر محلی تابعِ بیرونی را ببیند.
def myfunc():
x = 300
def myinnerfunc():
print(x)
myinnerfunc()
myfunc()
حوزه سراسری (Global Scope)
متغیر ساخته شده بیرونِ توابع، سراسری است. همه جا دیده می شود.
x = 300
def myfunc():
print(x)
myfunc()
print(x)
هم نامی متغیرها
اگر داخل تابع دوباره همان نام را بسازی، آن محلی حساب می شود.
x = 300
def myfunc():
x = 200
print(x)
myfunc()
print(x)
کلیدواژه global
با global می توان داخل تابع، متغیر سراسری ساخت یا تغییر داد.
def myfunc():
global x
x = 300
myfunc()
print(x)
x = 300
def myfunc():
global x
x = 200
myfunc()
print(x)
کلیدواژه nonlocal
با nonlocal داخل تابعِ تو در تو، متغیرِ تابعِ بیرونی را تغییر می دهیم.
def myfunc1():
x = "Jane"
def myfunc2():
nonlocal x
x = "hello"
myfunc2()
return x
print(myfunc1())
قاعده LEGB در جست وجوی نام
ترتیب جست وجو این است: Local ← Enclosing ← Global ← Built-in.
x = "global"
def outer():
x = "enclosing"
def inner():
x = "local"
print("Inner:", x)
inner()
print("Outer:", x)
outer()
print("Global:", x)
نکته: برای یادگیری ورودی ها به آرگومان ها سر بزن. همچنین صفحه توابع روابط تابع و حوزه دسترسی را بهتر نشان می دهد. مباحث بعدی در دکوراتورها هم به حوزه مرتبط است.
گام های عملی
- یک متغیر سراسری بساز و در تابع بخوان.
- همان نام را داخل تابع بساز و تفاوت را ببین.
- با global مقدار سراسری را تغییر بده.
- با nonlocal مقدار تابعِ بیرونی را عوض کن.
جمع بندی سریع
- محلی، فقط داخل همان تابع است.
- سراسری، همه جا دیده می شود.
- global برای ساخت یا تغییر سراسری است.
- nonlocal برای تغییر متغیرِ تابعِ بیرونی است.
- ترتیب LEGB را همیشه به یاد بسپار.