رفتن به مطلب اصلی

متغیرهای محلی و سراسری

معمولا وقتی صحبت از متغیرهای محلی (local) و سراسری (global) میشه، خیلی جو سنگینی برای کسایی که تازه برنامه نویسی رو شروع کردن ایجاد میشه. اما خوبیش اینه که با یکم تمرین میشه این مشکل رو برطرف کرد. به صورت کلی اگر بخوایم این دوتا مورد رو تعریف کنیم اینطور باید بگیم که متغیر سراسری همه جای برنامه قابل دسترسی هست ولی متغیر محلی فقط توی اون بلاک کد قابل دسترسی هست که توش تعریف شده. یه مورد دیگه اینکه متغیر سراسری با اینکه توی همه جای برنامه قابل دسترسی هست، ولی نمیشه مقدارشو به صورت محلی عوض کرد. همچنین متغیر محلی رو هم نمیشه خارج از کد بلاکی که توش تعریف شده تغییر داد. لازم نیست این موارد رو حفظ کنید. مثال های زیر دونه دونه اونها رو بررسی میکنه.

x = 6
def mesal():
print(x)
z = 5
print(z)
mesal()
print(z)

توی مثال بالا، یک متغیر سراسری به اسم x تعریف کردیم (اگر دقت کنین، این متغیر نه توی تابع هستش و توی یک حلقه و نه توی هیچ چیزی، آزادِ آزاده). بعدش یک تابع به اسم mesal تعریف کردیم. از اونجایی که x متغیر سراسری هستش، میتونیم بهش دسترسی داشته باشیم، ازش استفاده کنیم و ... . بعدش یه متغیر به اسم z تعریف کردیم. این متغیر، محلیه چون توی یه بلاک کد تعریف شده (منظورم اینه توی تابع mesal تعریف شده و مثل x آزادِ آزاد نیست). حالا میایم تابع ()mesal رو فراخونی میکنیم. همه چیز درست انجام میشه و ارور نمیده. اما وقتی خط print(z) رو اجرا می کنیم به مشکل بر میخوریم. چون داریم متغیر محلی z رو خارج از بلاک کدش استفاده می کنیم.

حالا کد زیر رو ببینید:

x = 6
def mesal2():
print(x)
print(x+5)
x+=6
print(x)

توی این کد هم یک متغیر سراسری به اسم x تعریف کردیم. یک تابع به اسم mesal2 تعریف کردیم. چون x سراسریه میتونیم بهش دسترسی داشته باشیم و دوتا خط تابع پرینت به راحتی اجرا میشه. اما مشکل زمانی هست که میخوایم مقدار x رو تغییر بدیم و نمیتونیم این کار رو انجام بدیم. پس چطور میشه این کار رو انجام داد؟ کد زیر رو ببینید:

x = 6
def mesal3():
global x
print(x)
x+=5
print(x)

توی کد بالا اول متغیر سراسری به اسم x تعریف کردیم و بعدش تابعی به اسم mesal3. حالا با استفاده از "کلمه کلیدی" global، متغیر x رو تعریف کردیم توی تابع. اینجاست که دیگه مجوز تغییر روی متغیر سراسری رو گرفتیم و هر کاری بخوایم میتونیم باهاش کنیم.

لازمه که راجع به "کلمه کلیدی" یا keyword توضیحی بدم. یکسری کلمات توی پایتون و تمام زبان های برنامه نویسی معنای خاصی دارن. هر زبانی کلمات مخصوص خودش رو داره. مثلا وقتی شما از def برای تعریف تابع استفاده میکنین، به کلمه def میگن کلمه کلیدی یعنی پایتون میدونه که وقتی از این کلمه استفاده میکنین یعنی میخواین یک تابع تعریف کنین. البته حفظ کردن تمام کلمات کلیدی کار سختیه و خب خیلی هم به کار نمیاد و توی مسیر یادگیری، با خیلی از این کلمه ها آشنا میشید.

ولی خب یه سریا دوست ندارن همش از کلمه کلیدی global استفاده کنن. راه حل های مختلفی میشه در نظر گرفت ولی راه حل زیر نسبتا مناسبه:

x = 6
def mesal4(param1):
print(param1)
param1+=5
print(param1)
return param1
x = mesal4(x)
print(x)

توی کد بالا اول یک متغیر سراسری تعریف کردیم. تابعی به اسم mesal4 هم با یک پارامتر تعریف کردیم. روی این پارامتر یکسری کارها توی تابع انجام دادیم و مقدارش رو برگردوندیم. حالا از این تابع استفاده میکنیم. ورودی تابع مقدار x هست و خروجی تابع رو دوباره توی خود x میذاریم. نکته اینجاست که با اینکه x متغیر سراسریه، ما هم اون رو خارج از تابع mesal4 تغییر دادیم و مقدارش رو عوض کردیم.