محدوده در پایتون (Python Scope)

محدوده در پایتون (Python Scope)
در پایتون، محدوده (Scope) مشخص میکند که یک متغیر، تابع یا شیء در کدام قسمت از برنامه قابل دسترسی است. درک محدوده به مدیریت دسترسی به متغیرها کمک میکند و از تداخل بین متغیرهای با نامهای مشابه در بخشهای مختلف برنامه جلوگیری میکند.
انواع محدوده در پایتون
- محدوده محلی (Local Scope)
- محدوده محصور (Enclosing Scope)
- محدوده عمومی (Global Scope)
- محدوده داخلی (Built-in Scope)
۱. محدوده محلی (Local Scope)
- متغیرهایی که داخل یک تابع تعریف میشوند متعلق به محدوده محلی آن تابع هستند.
- این متغیرها فقط در داخل تابع قابل دسترسی هستند و پس از اتمام اجرای تابع از بین میروند.
مثال:
def my_function():
x = 10 # متغیر محلی
print(x)
my_function()
# print(x) # این خط خطا میدهد چون x خارج از تابع قابل دسترسی نیست.
۲. محدوده محصور (Enclosing Scope)
- متغیرهای تعریفشده در یک تابع محصور (تابع خارجی) در توابع داخلی (تابع درون تابع) قابل دسترسی هستند.
- این محدوده یک سطح بالاتر از محدوده محلی قرار دارد و مربوط به Closure در پایتون است.
مثال:
def outer_function():
y = 20 # متغیر محصور
def inner_function():
print(y) # دسترسی به متغیر محصور در تابع داخلی
inner_function()
outer_function()
۳. محدوده عمومی (Global Scope)
- متغیرهایی که خارج از هر تابع یا بلاکی تعریف میشوند متعلق به محدوده عمومی هستند.
- این متغیرها در تمام فایل برنامه قابل دسترسی هستند.
مثال:
z = 30 # متغیر عمومی
def my_function():
print(z) # دسترسی به متغیر عمومی داخل تابع
my_function()
print(z) # دسترسی به متغیر عمومی خارج از تابع
- برای تغییر مقدار یک متغیر عمومی داخل تابع، از کلمه کلیدی
global
استفاده کنید.
مثال با global
:
count = 0 # متغیر عمومی
def increment():
global count # اعلام count به عنوان متغیر عمومی
count += 1
increment()
print(count) # خروجی: 1
۴. محدوده داخلی (Built-in Scope)
- محدوده داخلی شامل توابع و اشیاء داخلی پایتون است، مانند
len()
،print()
وrange()
. - این موارد همیشه در دسترس هستند مگر اینکه توسط متغیر یا تابع تعریفشده توسط کاربر بازنویسی شوند.
مثال:
print(len(“Hello”)) # len یک تابع داخلی است
قانون LEGB
پایتون برای پیدا کردن نام متغیرها از قانون LEGB پیروی میکند که ترتیب جستجو به شرح زیر است:
- L: محدوده محلی (Local Scope)
متغیرهای تعریفشده در داخل تابع جاری. - E: محدوده محصور (Enclosing Scope)
متغیرهای تابع محصور (برای توابع داخلی). - G: محدوده عمومی (Global Scope)
متغیرهای تعریفشده در سطح بالای یک فایل یا ماژول. - B: محدوده داخلی (Built-in Scope)
اشیاء و توابع داخلی پایتون.
مثال:
x = “Global”
def outer():
x = “Enclosing”
def inner():
x = “Local”
print(x) # خروجی: Local
inner()
print(x) # خروجی: Enclosing
outer()
print(x) # خروجی: Global
کلمه کلیدی nonlocal
- از کلمه کلیدی
nonlocal
برای تغییر مقدار یک متغیر در محدوده محصور استفاده میشود (نه محدوده عمومی).
مثال با nonlocal
:
def outer_function():
x = “Enclosing”
def inner_function():
nonlocal x # تغییر مقدار متغیر محصور
x = “Modified”
print(x) # خروجی: Modified
inner_function()
print(x) # خروجی: Modified
outer_function()
بهترین روشها برای کار با محدودهها
- تا حد امکان از استفاده از متغیرهای عمومی خودداری کنید؛ ترجیحاً از متغیرهای محلی استفاده کنید.
- از نامهای متغیر توصیفی استفاده کنید تا احتمال بازنویسی نامهای داخلی کاهش یابد.
- از محدوده محلی و محصور برای مدیریت دسترسی به متغیرها استفاده کنید.
دیدگاهتان را بنویسید