Scope یا دامنه متغیرها در پایتون

متغیرها در پایتون در محدوده‌ای که تعریف می شوند قابل دسترسی خواهند بود. به این مفهوم scope یا دامنه دسترسی به متغیر می‌گویند. در این مقاله با مثال‌هایی این مفهوم را بیشتر توضیح خواهیم داد.

متغیرهای محلی در پایتون

متغیری که داخل یک تابع ایجاد می‌شود متعلق به آن تابع است و خارج از آن تابع قابل دسترسی نیست. به متغیرهای تعغریف شده داخل یک تابع که فقط داخل همان تابع قابل دسترس است متغیر محلی می‌گویند. دقت کنید که دسترسی به متغیرهایی که داخل تابع تعریف شده امکان پذیر نیست و اگر بخواهید به این متغیرها دسترسی داشته باشید با خطا مواجه خواهید شد. به مثال زیر توجه نمائید.

[amir@arch ~]$ python
Python 3.9.6 (default, Jun 30 2021, 10:22:16) 
[GCC 11.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def myfunc():
...     x=300
...     print(x)
... 
>>> myfunc()
۳۰۰
>>> print(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

چاپ x در خط ۱۰ و خارج از محدوده‌ی تابع myfunc موجب شده است مفسر پایتون خطای پیدا نشدن متغیر را برگرداند.

بیشتر بخوانید: اعداد مختلط در پایتون

محدوده متغیرهای تابع داخل تابع

در تکه بالا متغیر x خارج از تابع myfunc قابل دسترسی نمی‌باشد.اما هر تابعی که داخل تابع myfunc تعریف شود متغیر x در داخل توابع تعریف شده در داخل myfunc در دسترس خواهد بود. به عبارت دیگر متغیرهای یک تابع در توابع داخل آن تابع در دسترس خواهند بود.

>>> def myfunc():
...     x = 300
...     def myinnerfunc():
...             print(x)
...     myinnerfunc()
... 
>>> myfunc()
۳۰۰

در تکه کد بالا متغیر x در تابع myfunc تعریف شده است و در تابع myinnerdef با دستور print چاپ شده است. همچنین تابع myinnerfunc به ظور طبیعی در خارج از تابع myfunc قابل دسترس نخواهد بود.

متغیرهای سراسری در پایتون

هر متغیری که در بدنه‌ی اصلی کدهای پایتون ایجاد شود متغیر سراسری گفته می‌شود و در تمامی قسمت‌های کد ازجمله داخل توابع در دسترس خواهد بود.

۳۰۰
>>> x = 300 
>>> def myfunc():
...     print(x)
...     def myinnerfunc():
...             print(x)
...     myinnerfunc()
... 
>>> myfunc()
۳۰۰
۳۰۰

در تکه کد بالا x یک متغیر سراسری است و در داخل تابع mydef (اولین ۳۰۰) و myinnerfunc (دومین ۳۰۰) چاپ شده است.

متغیرهای هم نام

اگر دو متغیر هم نام در داخل و خارج از تابع داشته باشید مفسر پایتون این دو متغیر را مجزا از هم در نظر می‌گیرد. به تکه کد زیر دقت کند.

>>> x = 300
>>> def myfunc():
...     x = 200
...     print(x)
... 
>>> myfunc()
۲۰۰
>>> print(x)
۳۰۰

کلمه کلیدی global در پایتون

اگر بخواهید یک متغیر را داخل یک تابع به عنوان متغیر سراسری تعریف کنید تا در بدنه‌ی اصلی و تمامی توابع دیگر در دسترس باشد می‌توانید قبل از نام متغیر از کلمه‌ی کلیدی global استفاده نمائید.

>>> def myfunc():
...     global x
...     x = 300
... 
>>> myfunc()
>>> print(x)
۳۰۰

در مثال بالا اگر پس از تعریف تابع بدون اینکه تابع مورد نطر را فراخوانی کنید متغیری که در داخل تابع به عنوان متغیر سراسری تعریف شده را چاپ نمائید با خطا مواجه خواهید شد.

وقتی یک تابع را تعریف می‌کنید هیچ فضایی برای آن تابع در رم اختصاص داده نخواهد شد لذا اگر تابع فراخوانی نشود متغیرهای آن تابع ایجاد نمی‌شوند به مثال زیر توجه نمائید.

>>> def mfunc():
...     global y
...     y = 300
... 
>>> print(y)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'y' is not defined

همچنین با استفاده از کلمه‌ی کلیدی global در پایتون می‌توانید یک متغیر سراسری را وارد یک تابع کرده و در داخل تابع به آن دسترسی داشته باشید.

>>> p = 200
>>> def myfunc():
...     global p
...     p = 500
... 
>>> print(p)
۲۰۰

منبع: w3school

۲ Responses

  1. امیرحسیننن گفت:

    سلام و مممنون از نحوه توضیح این مبحث ساده و روان توضبح داده بودید

دیدگاه خود را بنویسید