دامنه متغیرها در پایتون — به زبان ساده
در این مطلب، «دامنه متغیرها» (Scope of Variables) شامل «متغیر سراسری» (Global Variable)، «متغیر محلی» (Local Variable) و «متغیر غیر محلی» (Nonlocal Variables) در «زبان برنامهنویسی پایتون» (Python Programming Language) مورد بررسی قرار گرفته است. سپس، کاربرد هر یک از این دامنه متغیرها در پایتون به طور کامل تشریح شده است.
دامنه متغیرها در پایتون
در علوم کامپیوتر، دامنه «انقیاد نام» (Name Binding) (پیوند بین یک نام و یک موجودیت، مانند متغیر)، ناحیهای از برنامه کامپیوتری است که انقیاد در آن معتبر است. منظور از اعتبار، آن است که از نام آن موجودیت میتوان برای ارجاع به آن استفاده کرد.
به این ناحیه، «بلوک دامنه» (Scope Block) گفته میشود. یک نام ممکن است در بلوکهای دامنه مختلف در یک برنامه واحد، برای ارجاع دادن به موجودیتهای مختلفی به کار برود. در واقع، در این حالت نام دارای انقیادهای مختلفی است. در متون علمی قدیمی از دامنه انقیاد با عنوان پدیداری یک موجودیت نیز یاد شده است.
متغیرهای سراسری
در پایتون، یک متغیر تعریف شده بیرون از تابع یا در دامنه سراسری با عنوان متغیر سراسری شناخته میشود. این یعنی، متغیر سراسری از درون یا بیرون یک تابع در دسترس است. در ادامه، مثالی از روش ساخت متغیرهای سراسری در پایتون آورده شده است.
مثال ۱: ساخت یک متغیر سراسری
1x = "global"
2
3def foo():
4 print("x inside :", x)
5
6foo()
7print("x outside:", x)
خروجی حاصل از اجرای کد بالا به صورت زیر خواهد بود.
1x inside : global
2x outside: global
در کد بالا، x به عنوان متغیر سراسری ساخته شده و ()foo برای چاپ متغیر سراسری x تعریف شده است. در نهایت، ()foo فراخوانی میشود که مقدار x را چاپ میکند. اما اگر قصد تغییر دادن مقدار x درون تابع وجود داشته باشد چه اتفاقی به وقوع میپیوندد؟
1x = "global"
2
3def foo():
4 x = x * 2
5 print(x)
6foo()
خروجی حاصل از اجرای قطعه کد بالا، به صورت زیر است.
UnboundLocalError: local variable 'x' referenced before assignment
هنگام اجرای کد، خروجی یک خطا را نمایش میدهد، زیرا پایتون با x به عنوان یک متغیر محلی برخورد میکند و در عین حال، x درون ()foo تعریف نشده است. برای کارآمدتر کردن کد، از کلیدواژه global استفاده شده است.
متغیرهای محلی
یک متغیر تعریف شده درون بدنه تابع یا در دامنه محلی، با عنوان متغیر محلی شناخته شده است.
مثال ۲: دسترسی به متغیرهای محلی درون دامنه
1def foo():
2 y = "local"
3
4foo()
5print(y)
هنگام اجرای کد، خروجی به صورت زیر خواهد بود.
NameError: name 'y' is not defined
خروجی، یک پیغام خطا نمایش میدهد، زیرا برای دسترسی به متغیر محلی y در دامنه سراسری تلاش میشود؛ در حالی که متغیرهای محلی صرفا درون ()foo و در واقع در دامنه محلی کار میکنند. در ادامه، مثالی از روش ساخت متغیر محلی در پایتون ارائه شده است.
مثال ۳: ساخت متغیر محلی
معمولا، یک متغیر محلی درون تابع، برای ساخت متغیر محلی تعریف میشود.
1def foo():
2 y = "local"
3 print(y)
4
5foo()
هنگام اجرا کد بالا، خروجی به صورت زیر خواهد بود.
1local
در ادامه، به مسالهای که پیشتر بیان شد، یعنی نیاز به تغییر متغیر سراسری x درون ()foo، پرداخته خواهد شد.
متغیرهای سراسری و محلی
در ادامه، روش استفاده از متغیرهای سراسری و محلی در یک کد واحد، آموزش داده شده است.
مثال ۴: استفاده از متغیرهای محلی و سراسری در یک کد واحد
1x = "global"
2
3def foo():
4 global x
5 y = "local"
6 x = x * 2
7 print(x)
8 print(y)
9
10foo()
با اجرای کد بالا، خروجی به صورت زیر خواهد بود.
global global local
در کد بالا، x به عنوان متغیر سراسری و y به عنوان متغیر محلی در ()foo تعریف شده است. سپس، از عملگر ضرب برای ویرایش متغیر محلی x استفاده شده و x و y چاپ شدهاند. پس از فراخوانی ()foo، مقدار x به global global تغییر پیدا میکند، زیرا از x * 2 برای دو بار چاپ global استفاده شده است. پس از آن، مقدار متغیر محلی y پرینت میشود.
مثال ۵: متغیر سراسری و متغیر محلی با نام مشابه
1x = 5
2
3def foo():
4 x = 10
5 print("local x:", x)
6
7foo()
8print("global x:", x)
پس از اجرای کد، خروجی به صورت زیر خواهد بود.
local x: 10 global x: 5
در کد بالا، از نام x برای متغیرهای محلی و سراسری استفاده میشود. هنگام چاپ کردن یک متغیر واحد، نتایج متفاوتی حاصل میشود، زیرا متغیر در هر دو دامنه تعریف شده و درون ()foo دارای دامنه محلی و بیرون از ()foo دارای دامنه سراسری است. با چاپ متغیر درون ()foo، عبارت local x: 10 به عنوان خروجی چاپ میشود. به این مورد، دامنه محلی متغیر گفته میشود. به طور مشابه، هنگامی که متغیر بیرون از ()foo چاپ شود، global x: 5 به عنوان خروجی چاپ میشود. در این حالت گفته میشود که متغیر دارای دامنه سراسری است.
متغیرهای غیر محلی
متغیر غیر محلی، در توابع تو در تویی استفاده میشود که دامنه محلی آنها تعریف نشده است. این یعنی، متغیر میتواند نه در دامنه محلی و نه در دامنه سراسری باشد.
در ادامه، مثالی از چگونگی ساخته شدن متغیر غیر محلی در پایتون ارائه خواهد شد. از کلیدواژه nonlocal برای ساخت متغیر غیر محلی استفاده میشود.
مثال ۶: ساخت یک متغیر غیر محلی
1def outer():
2 x = "local"
3
4 def inner():
5 nonlocal x
6 x = "nonlocal"
7 print("inner:", x)
8
9 inner()
10 print("outer:", x)
11
12outer()
خروجی حاصل از اجرای قطعه کد بالا، به صورت زیر خواهد بود.
inner: nonlocal outer: nonlocal
در کد بالا، یک تابع تو در تو با عنوان ()inner وجود دارد. از کلیدواژه nonlocal برای ساخت متغیر nonlocal استفاده میشود. تابع ()inner، در دامنه تابع دیگر، یعنی ()outer تعریف شده است.
توجه: اگر مقدار متغیر غیر محلی توسط کاربر تغییر کند، تغییرات در متغیر محلی ظاهر میشوند.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
عالی