به آموزشگاه مجازی سینا خوش آمدید!

آموزش میدان دید(scope) در پایتون

امتیاز
(0)

میدان دید(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 پیروی می‌کند و به ترتیب زیر، به جستجوی آنها می‌پردازد:

  1. جستجو به صورت میدان دید محلی(Local): متغیرهایی که در درون یک تابع تعریف می‌شوند. 
  2. جستجو به صورت میدان دید محصور شده(Enclosing): متغیرهایی که در درون تابع‌های تودرتو تعریف می‌شوند. 
  3. جستجو به صورت میدان دید سراسری(Global): متغیرهای سراسری که بیرون از تابع‌ها قرار دارند. 
  4. جستجو به صورت داخلی(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

 

  • بازدید: 38

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.

ارسال