مروری بر Scope در پایتون

python scope overview
20 آبان 1403

در زبان برنامه نویسی پایتون، مفهوم Scope (زمینه یا حوزه) یکی از نکات کلیدی و مهم در مدیریت دسترسی به متغیرها مشخص می‌شود. به طور خلاصه، Scope عبارت است از آن محدوده‌ای از کد که در آن یک متغیر قابل استفاده و دسترس پذیر است. درک درست و منطقی از Scope می‌تواند شما را در مدیریت دقیق‌تر پروژه‌های پایتون و توسعه کدهای بهینه‌تر یاری کند.

پایتون دارای چند نوع مختلف از Scope است که عبارت‌اند از: Local، Enclosing، Global و Built-in. این نوع‌ها به ترتیب اولویت دسترسی و بر اساس الگوریتم LEGB مرتب می‌شوند. برای مقدمه، Local ترین سطح در یک تابع تعریف می‌شود و به همین نسبت، Built-in که متعلق به خود پایتون است، در بالاترین سطح قرار می‌گیرد.

متغیرهایی که در داخل یک تابع تعریف می‌شوند، تنها در آن تابع قابل دسترس هستند و به آنها Local Scope گفته می‌شود. از طرفی، اگر متغیری در بدنه اصلی یک برنامه Python تعریف شود، این متغیر Global Scope خواهد داشت و در تمامی قسمت‌های برنامه قابل دسترس خواهد بود مگر اینکه متغیری به همان اسم در Local Scope تعریف شده باشد.

برای ایجاد و استفاده صحیح از متغیرها در پایتون، باید به تفاوت بین این سطوح و رفتارشان در زمان اجرا توجه ویژه‌ای داشت. این کار می‌تواند از ایجاد باگ‌های غیرمنتظره در برنامه جلوگیری کرده و به بهبود قابلیت نگهداری کد کمک کند.

علاوه بر این، با استفاده از کلمات کلیدی مثل global و nonlocal می‌توانید کنترل بیشتری روی Scope متغیرها داشته باشید. به‌عنوان مثال، اگر نیاز دارید مقداری را در یک تابع تغییر دهید اما آن متغیر در Global Scope تعریف شده باشد، می‌توانید از global استفاده کنید.

در نهایت، درک صحیح از این مفاهیم می‌تواند شما را در مسیر پیشرفت در پایتون کمک کند و باعث شود که کدهای شما سریع‌تر و روان‌تر شوند. در ادامه، یک مثال کد به همراه توضیح خطوط خواهیم داشت.


    def outer_function():
x = 'local variable in outer'
def inner_function():
nonlocal x
x = 'modified by inner'
print('Inner:', x)
inner_function()
print('Outer:', x)
outer_function()

def outer_function():
این خط، تابع outer_function را تعریف می‌کند که دارای یک متغیر محلی x است.

x = 'local variable in outer'
متغیر x در تابع outer_function تعریف و مقداردهی اولیه شده است.

def inner_function():
تابع inner_function داخل outer_function تعریف شده‌است و بنابراین دارای Enclosing Scope است.

nonlocal x
این خط نشان می‌دهد که ما به متغیر x از Enclosing Scope اشاره می‌کنیم، که همان متغیر x در outer_function است.

x = 'modified by inner'
در اینجا، مقدار x در Enclosing Scope تغییر داده‌شده‌است.

print('Inner:', x)
چاپ مقدار x پس از تغییر آن در inner_function.

inner_function()
فراخوانی تابع inner_function.

print('Outer:', x)
چاپ مقدار x پس از اجرای inner_function.

outer_function()
فراخوانی تابع outer_function برای اجرای کل فرآیند.

سوالات متداول

؟

چرا متغیرها در پایتون خطا دارند؟

؟

چگونه می‌توان متغیرهای Global گردید؟

؟

آیا می‌توان در پایتون به متغیر والد تابع دستیابی داشت؟