آموزش میدان دید(scope) در پایتون
میدان دید(scope) چیست؟
(مقدار) یک متغیر، تنها در درون محدودهای که (این متغیر) در آن ایجاد شده است، در دسترس خواهد بود. به این موضوع، میدان دید(scope) گفته میشود.
میدان دید محلی(Local Scope)
یک متغیر که در درون یک تابع ایجاد شده است، به میدان دید محلیِ(local scope) آن تابع تعلق دارد و تنها میتوانیم از (مقدار) آن، در درون آن تابع استفاده کنیم. به مثال زیر توجه کنید:
مثال شماره 1
ما می توانیم به (مقدار) یک متغیر که در درون یک تابع ایجاد شده است، در درون آن تابع دسترسی داشته باشیم:
def myfunc():
x = 300
print(x)
myfunc()
نتیجه:
300
امتحان کنیداستفاده از تابع در درون تابع
همان طور که در مثال بالا توضیح داده شد، متغیر x در بیرون از آن تابع، در دسترس نیست؛ اما در هر تابعی که در درون این تابع قرار داشته باشد، در دسترس است:
مثال شماره 2
یک متغیر محلی، میتواند در درون یک تابع، که در داخل تابع دیگری قرار دارد، مورد استفاده قرار گیرد:
def myfunc():
x = 300
def myinnerfunc():
print(x)
myinnerfunc()
myfunc()
نتیجه:
300
امتحان کنیدمیدان دید سراسری(Global Scope)
یک متغیر که در بدنهی اصلی کدهای پایتون قرار گرفته باشد، یک متغیر سراسری(global variable) محسوب میشود و به میدان دید سراسری(global) تعلق دارد. متغیرهای سراسری، در تمام میدانهای دید، یعنی در میدان دید سراسری(global) یا میدان دید محلی(local) در دسترس هستند.
مثال شماره 3
یک متغیر که در بیرون از یک تابع ایجاد شده باشد، یک متغیر سراسری(global) است و در هر جایی میتوانیم از آن استفاده کنیم:
x = 300
def myfunc():
print(x)
myfunc()
print(x)
نتیجه:
300
300
امتحان کنیدنام گذاری متغیرها
اگر از یک نام متغیر مشابه، در درون و بیرون از یک تابع استفاده کنیم، پایتون آنها را به صورت دو متغیر مجزا(جداگانه) در نظر خواهد گرفت، به طوری که یکی از آنها (یعنی متغیری که در بیرون از تابع قرار دارد) میدان دید سراسری(global) دارد و دیگری (یعنی متغیری که در درون تابع قرار دارد) میدان دید محلی(local) خواهد داشت.
مثال شماره 4
تابع زیر مقدار محلی x را پرینت میکند و پس از آن، کدها مقدار سراسری x را پرینت میکنند:
x = 300
def myfunc():
x = 200
print(x)
myfunc()
print(x)
نتیجه:
200
300
امتحان کنیداستفاده از کلمهی کلیدی Global
اگر نیاز دارید یک متغیر سراسری(global) ایجاد کنید، اما در میدان دید محلی(local) قرار دارید، میتوانید از کلمهی کلیدی global استفاده کنید. کلمهی کلیدی global یک متغیر را به یک متغیر سراسری تبدیل میکند.
مثال شماره 5
اگر از کلمهی کلیدی global استفاده کنید، متغیر ما به میدان دید سراسری(global) تعلق پیدا خواهد کرد:
def myfunc():
global x
x = 300
myfunc()
print(x)
نتیجه:
300
امتحان کنیدهمچنین اگر میخواهید در درون یک تابع، در یک متغیر سراسری تغییری ایجاد کنید، میتوانید از کلمهی کلیدی global استفاده کنید:
مثال شماره 6
برای تغییر دادن مقدار یک متغیر سراسری در درون یک تابع، با استفاده از کلمهی کلیدی global، به این متغیر رجوع میکنیم:
x = 300
def myfunc():
global x
x = 200
myfunc()
print(x)
نتیجه:
200
امتحان کنیداستفاده از کلمهی کلیدی nonlocal
از کلمهی کلیدی nonlocal برای کار با متغیرهای درون تابعهای تودرتو استفاده میشود. کلمهی کلیدی nonlocal باعث میشود که متغیر ما به تابع بیرونی تعلق پیدا کند.
مثال شماره 7
اگر از کلمهی کلیدی nonlocal استفاده کنیم، متغیر ما به تابع بیرونی تعلق خواهد داشت:
def myfunc1():
x = "Jane"
def myfunc2():
nonlocal x
x = "hello"
myfunc2()
return x
print(myfunc1())
نتیجه:
hello
امتحان کنیدقانون LEGB در پایتون
پایتون، وقتی که به نام متغیرها مراجعه میکند، از قانون LEGB پیروی میکند و به ترتیب زیر، به جستجوی آنها میپردازد:
- جستجو به صورت میدان دید محلی(Local): متغیرهایی که در درون یک تابع تعریف میشوند.
- جستجو به صورت میدان دید محصور شده(Enclosing): متغیرهایی که در درون تابعهای تودرتو تعریف میشوند.
- جستجو به صورت میدان دید سراسری(Global): متغیرهای سراسری که بیرون از تابعها قرار دارند.
- جستجو به صورت داخلی(Built-in): متغیرهایی که به طور پیش فرض، در پایتون تعریف شدهاند.[2]

مثال شماره 8
درک قانون LEGB در پایتون:
x = "global"
def outer():
x = "enclosing"
def inner():
x = "local"
print("Inner:", x)
inner()
print("Outer:", x)
outer()
print("Global:", x)
نتیجه:
Inner: local
Outer: enclosing
Global: global
امتحان کنیدتوضیح کدهای بالا: ابتدا در خط 1، یک متغیر به نام x تعریف می کنیم که میدان دید سراسری(global) دارد، سپس خط 11 اجرا میشه و تابع outer() صدا زده میشه. پس کدهای درون تابع outer() یعنی از خط 4 شروع به اجرا میشن. در خط 4 متغیر x یک متغیر محصور شده(Enclosing) محسوب میشود که در درون تابع های تودرتو قرار داره. در خط 5 یک تابع درونی به نام inner() تعریف شده. که متغیر x در آن میدان دید محلی(local) داره. در خط 8، تابع inner() صدا زده میشه و کدهای خط 6 و 7 اجرا میشوند. و مقدار x که در خط 6 برابر با رشتهی "local" است، در خط 7 پرینت میشود. حالا از تابع inner() بیرون میآییم و در خط 9 مقدار متغیر x که در خط 4 مشخص شد، و میدان دید محصور شده داشت، پرینت میشود. حالا تابع outer() به اتمام میرسد و به خط 12 منتقل میشویم و مقدار متغیر x که در خط 1 به صورت سراسری تعریف شده است را پرینت میکنیم.
منبع 1: www.w3schools.com/python
منبع پاراگراف شماره [2] با اقتباس از: sabzdanesh.com/python-scope
منبع 3: www.geeksforgeeks.org/python
- بازدید: 39
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.