در زبان پایتون، متغیر نامی نمادین است که به یک مقدار در حافظه اشاره میکند؛ درست مانند برچسبی روی یک جعبه(نام متغییر) که محتوای آن را مشخص میکند(مقدار متغیر). با استفاده از متغیرها میتوان به دادهها نامهای معنادار داد، خوانایی کد را افزایش داد و از مقادیر در بخشهای مختلف برنامه بهراحتی استفاده کرد.
تعریف متغیر بسیار ساده است: کافیست نامی انتخاب کرده و با علامت = مقداری به آن اختصاص دهید. پایتون با داشتن نوعدهی پویا (dynamic typing)، نوع متغیر را بهطور خودکار بر اساس مقدار تعیین میکند؛ بنابراین نیازی به مشخصکردن نوع آن نیست. مثلاً اگر بنویسید x = 5 و سپس “x = "Hello، پایتون بهراحتی نوع متغیر را از عدد صحیح به رشته تغییر میدهد.
نوع دادهها مشخص میکنند که چه نوع مقداری در متغیر قرار دارد و چه عملیاتی روی آن قابل انجام است.
انواع داده (data variables) در پایتون
نوع متنی (رشتهای)
str: برای نگهداری متن استفاده میشود.- مثال:
"سلام"یا"Hello"
انواع عددی
int: عدد صحیح مثل۵یا۳-float: عدد اعشاری مثل۳.۱۴complex: عدد مختلط مثل۲ + ۳j
نوع بولین (منطقی)
bool: فقط دو مقدار ممکن دارد:True(درست) وFalse(غلط)
نوع None
NoneType: نوع خاصی از دیتا که معنای هیچ چیز را دارد،Noneبرای زمانی که متغیر هنوز مقدار مشخصی ندارد استفاده میشود.
انواع دنبالهای (Sequence Types)
list(لیست): مجموعهای قابل تغییر از مقادیری که تریب دارند.- مثال:
[1, 2, 3]
- مثال:
tuple(تاپل): مثل لیست است ولی غیرقابل تغییر می باشد.- مثال:
(1, 2, 3) range: برای تولید بازهای از اعداد استفاده میشود- مثال:
range(0, 5)→ شامل اعداد ۰ تا ۴
- مثال:
نوع نگاشتی (Map Type)
dict(دیکشنری): برای نگهداری جفتهای “کلید-مقدار”- مثال:
{"name": "Ali", "age": 25}
- مثال:
نوع مجموعهای (Set Types)
set: مجموعهای از مقادیر یکتا (بدون تکرار)- مثال:
{1, 2, 3}
- مثال:
frozenset: مثلsetاست اما تغییرناپذیر (immutable)
به عنوان نمونه، در کد زیر چند متغیر با انواع مختلف تعریف شدهاند و پایتون نوع آنها را به صورت خودکار تعیین میکند:
# تعریف متغیرهای مختلف
name = "Alice" # str (رشته)
age = 30 # int (عدد صحیح)
height = 5.9 # float (عدد اعشاری)
is_student = True # bool (منطقی)
scores = [85, 90, 92]# list (لیست از اعداد صحیح)
info = {"city": "London", "year": 2023} # dict (دیکشنری)
در مثال بالا، رشته "Alice" به متغیر name، عدد صحیح 30 به متغیر age، عدد اعشاری 5.9 به height و مقدار منطقی True به is_student تخصیص یافته است. همچنین یک لیست از اعداد به نام scores و یک دیکشنری به نام info تعریف شدهاند. پایتون با توجه به مقدار هر متغیر، نوع مناسب را به آن اختصاص داده است. برای اطمینان میتوانید تابع داخلی ()type را روی هر یک از این متغیرها استفاده کنید تا نوع آنها را ببینید. مثلا print(type(age)) خروجی <class 'int'> را نشان میدهد که به معنای عدد صحیح بودن age است.
در ادامه، به جزئیات بیشتری درباره نامگذاری متغیرها، نحوهی انتساب مقادیر (حتی چند مقدار همزمان)، روشهای نمایش خروجی متغیرها و همینطور متغیرهای سراسری (Global) در پایتون میپردازیم. با ارائهی مثالهای ساده و سپس واقعی، مفاهیم را گامبهگام بررسی خواهیم کرد.
نامگذاری متغیرها در پایتون (Variable Names)
انتخاب نام مناسب برای متغیرها یکی از مهارتهای مهم برنامهنویسی است. در پایتون، قوانین نامگذاری متغیرها به شکل زیر است
- نام متغیر باید با یک حرف الفبا (a-z, A-Z) یا علامت زیرخط (
_) شروع شود و نمیتواند با رقم آغاز شود
به عنوان مثال، name1 یک نام معتبر است اما 1name معتبر نیست.
- نام متغیر میتواند شامل حروف، ارقام و زیرخط باشد، اما کاراکتر دیگری (مانند فاصله یا نشانههای نگارشی) مجاز نیست. مثلا
my_var2معتبر است اماmy-varیاmy varمعتبر نیستند. - حروف بزرگ و کوچک در نام متغیرها تفاوت دارند (حساس به حروف بزرگ/کوچک هستند). یعنی
Ageوageدو متغیر مجزا محسوب میشوند. بنابراین بهتر است در استفاده از حروف بزرگ احتیاط کنید تا ناخواسته دو متغیر متفاوت ایجاد نکنید. - نام متغیر نباید با کلیدواژههای رزروشدهی پایتون (مانند
if,for,classو غیره) یکسان باشد. این کلمات قبلاً برای مقاصد خاصی در زبان تعریف شدهاند و استفاده از آنها به عنوان نام متغیر موجب خطا میشود. برای مشاهدهی فهرست این کلمات کلیدی میتوانید از دستورhelp("keywords")در پایتون استفاده کنید.
علاوه بر رعایت قوانین فوق که الزامی هستند،در ادامه چند best practices نامگذاری نیز توصیه میشوند تا کد شما خواناتر و قابلفهمتر شود
- تا حد امکان از نامهایی استفاده کنید که بیانگر نقش متغیر باشند. به عنوان مثال، به جای استفاده از نام مبهم
xیاvarبرای متغیری که سن کاربر را نگه میدارد، از نام واضحuser_ageاستفاده کنید. نام معنیدار به دیگران (و خودتان در آینده) کمک میکند هدف متغیر را سریعتر متوجه شوید. - برای متغیرهای چندکلمهای، رایجترین سبک snake_case است؛ یعنی تمام حروف کوچک نوشته میشوند و کلمات با کاراکتر
_ (underline)از هم جدا میگردندبه طور مثالtotal_priceیاuser_nameنسبت بهtotalPriceخواناتر هستند. سبکهای دیگری مانند CamelCase (مثلTotalPrice) یا PascalCase نیز وجود دارند، اما طبق راهنمای سبک کد نویسی پایتون (PEP 8) برای متغیرها و توابع از حروف کوچک و زیرخط استفاده میشود. - از بهکاربردن حروف لاتین عجیب یا کاراکترهای غیراستاندارد (مانند حروف فارسی) در نام متغیر خودداری کنید. اگرچه پایتون پشتیبانی اولیه از یونیکد در نامگذاری را دارد، اما این کار میتواند خوانایی کد را برای دیگران (و حتی خودتان) کاهش دهد و در برخی محیطها مشکلاتی ایجاد کند.
- در صورت نیاز برای تاکید، میتوانید از زیرخط پیشرو(Leading Underscore) استفاده کنید. مثلا طبق قرارداد، متغیرهایی که با یک زیرخط آغاز میشوند (مثل
_temp) نشاندهندهی متغیرهای داخلی یا موقتی هستند که استفادهی عمومی ندارند. دو Underscore در جلو و عقب متغییر (مثل__name__) نیز اغلب برای نامهای ویژهی پایتون که رزرو شدهاند.
در مجموع، انتخاب نام خوب برای متغیر همانند ایجاد یک داکیومنت کوچک عمل میکند و بدون نیاز به کامنت اضافه، منظور کد را منتقل میشود. به این مثال توجه کنید: فرض کنید تعدادی جعبه برای نگهداری اشیاء دارید. اگر روی هر جعبه برچسبی مثل “ابزار”, “کتابها” یا “اسناد” بچسبانید، پیدا کردن چیزی که میخواهید آسانتر خواهد بود. در برنامهنویسی نیز با نامگذاری مناسب متغیرها، درک و نگهداری کد بسیار سادهتر میشود.
مثالهایی از نامگذاری صحیح و غلط
برای روشنتر شدن مطلب، به چند مثال توجه کنید:
# نامگذاری صحیح
student_count = 25 # تعداد دانشجویان
_average_score = 19.5 # میانگین امتیاز (متغیر داخلی با _ شروع شده)
userName = "ali" # اگرچه پپ۸ توصیه نمیکند، اما از نظر قواعد مجاز است
# نامگذاری غلط (این خطوط هر کدام خطا تولید میکنند)
2nd_place = "Sara" # شروع با رقم مجاز نیست
my-name = "Python" # استفاده از خط تیره مجاز نیست
for = 5 # 'for' یک کلمهی کلیدی رزروشده است
در نمونه بالا، student_count یک نام صحیح به سبک snake_case است که مشخص میکند این متغیر تعداد دانشجویان را نگه میدارد. متغیر average_score_ نیز با یک زیرخط آغاز شده تا نشان دهد این ممکن است یک متغیر موقتی یا داخلی باشد. در مقابل، نمونههای بخش “نامگذاری غلط” هر کدام یکی از قوانین را نقض کردهاند و در نتیجه در صورت اجرا با خطا مواجه میشوند.
تخصیص چند مقدار به چند متغیر پایتون (Assign Multiple Values)
یکی از قابلیتهای جالب و کاربردی پایتون این است که میتوانید چند متغیر را به صورت همزمان مقداردهی کنید. این کار که
multi-variable assignment یا parallel assignment نامیده میشود، باعث میشود کد شما خلاصهتر و خواناتر شود و از تکرار جلوگیری گردد
در این بخش، به سه حالت متداول چندتاییکردن انتسابها میپردازیم:
- انتساب چند مقدار به چند متغیر در یک خط: شما میتوانید در یک دستور، چند متغیر را تعریف کرده و برای هر کدام یک مقدار مشخص تعیین کنید. مثلا:
x, y, z = 1, 2, 3. در این مثال، متغیرxمقدار1, متغیرyمقدار2و متغیرzمقدار3میگیرد. نکته مهم این است که تعداد متغیرها در دو سمت=باید برابر باشد، در غیر این صورت خطا رخ میدهد. این روش مخصوصاً زمانی مفید است که بخواهید مقادیر مرتبط را همزمان تنظیم کنید. به عنوان مثال:
width, height, color = 1920, 1080, "blue"
print(width) # 1920
print(color) # "blue"
در اینجا سه متغیر width (عرض)، height (ارتفاع) و color (رنگ) در یک خط مقداردهی شدهاند که کد را مختصرتر کرده است.
- انتساب یک مقدار یکسان به چند متغیر: پایتون امکان میدهد یک مقدار واحد را به چند متغیر به طور همزمان اختصاص دهید
به عنوان مثال، فرض کنید میخواهید چند متغیر اولیه را برای شروع برنامه مقداردهی کنید:
is_logged_in = is_admin = is_active = False
در این قطعهکد، هر سه متغیر is_logged_in, is_admin و is_active به مقدار False تنظیم شدهاند
این روش وقتی کاربرد دارد که چند متغیر مختلف در ابتدا باید مقدار مشترکی داشته باشند (مثلاً همهی فلگها روی false تنظیم شوند). نتیجهی بالا معادل این است که هر سه دستور انتساب را جداگانه بنویسیم، اما به مراتب کوتاهتر و تمیزتر است.
- پخش کردن یک مجموعه (Unpacking): قابلیت دیگری که قدرت پایتون را نشان میدهد تجزیه مقادیر یک مجموعه و تخصیص آنها به متغیرها است.
این به این معناست که میتوانید یک لیست، تاپل یا هر iterable دیگر را در سمت راست قرار داده و مقادیرش را به متغیرهای سمت چپ نسبت دهید. به عنوان مثال:
person = ("Jane", 25, "Developer")
name, age, job = person
print(name) # خروجی: Jane
print(age) # خروجی: 25
print(job) # خروجی: Developer
در این مثال، تاپل person شامل سه مقدار است و ما آن را به سه متغیر name, age, job تجزیه کردهایم
این روش خوانایی کد را افزایش میدهد؛ زیرا به جای دسترسی به person[0], person[1] و … به صورت مستقیم متغیرهای مفهومی داریم. پایتون همچنین اجازهی بازگشایی بخشی از مجموعه با استفاده از عملگر * را میدهد. برای مثال:
numbers = [1, 2, 3, 4, 5]
a, b, *rest = numbers
print(a, b) # ۱ ۲ خروجی
print(rest) # [3 , 4 , 5] خروجی
در اینجا، متغیر a مقدار ۱، b مقدار ۲ و rest لیستی شامل بقیه اعداد [3, 4, 5] خواهد بود.
یکی از ترفندهای بسیار کاربردی که از انتساب چندتایی بهره میبرد جابجایی مقادیر دو متغیر (سوآپ) است. در بسیاری از زبانها برای جابجایی مقادیر دو متغیر نیاز به یک متغیر موقت داریم، اما در پایتون میتوان این کار را در یک خط انجام داد:
x = 5
y = 10
x, y = y, x # مقادیر x و y را جابجا میکند
print(x) # خروجی: 10
print(y) # خروجی: 5
در این قطعه کد، به سادگی مقدار x و y با یکدیگر عوض شدهاند. پایتون ابتدا سمت راست را به عنوان یک تاپل (y, x) ارزیابی میکند و سپس آن را به متغیرهای سمت چپ (x, y) تخصیص میدهد. این شیوهی مختصر و زیبا، علاوه بر کاهش حجم کد، احتمال خطا (فراموش کردن متغیر موقت یا استفاده نادرست از آن) را نیز کمتر میکند.
نمایش مقادیر متغیرها
پس از تعیین و مقداردهی متغیرها، نیاز داریم مقادیر آنها را به نحوی به خروجی (مثلاً کنسول یا صفحهنمایش) نمایش دهیم تا کاربر یا برنامهنویس از آنها استفاده کند. در پایتون معمولاً از تابع ()print برای این منظور استفاده میشود
در این بخش، روشهای مختلف نمایش متغیرها و قالببندی خروجی را بررسی میکنیم.
استفادهی ساده از print
سادهترین راه، پاسدادن متغیر(ها) به تابع ()print است. برای مثال:
x = "Python is awesome"
print(x)
در اینجا خروجی برنامه چیزی شبیه متن "Python is awesome" خواهد بود که مقدار متغیر x است
تابع ()print میتواند چندین متغیر و مقدار را نیز همزمان نمایش دهد. کافیست آنها را با کاما جدا کنید:
name = "Ali"
age = 20
print("Name:", name, ", Age:", age)
خروجی:
Name: Ali , Age: 20
همانطور که مشاهده میکنید، print بین مقادیر مختلف یک فاصلهی پیشفرض قرار میدهد و آنها را پشت سر هم نمایش میدهد
استفاده از ویرگول در تابع print این مزیت را دارد که حتی اگر انواع دادهها متفاوت باشند (مثلاً رشته و عدد)، پایتون آنها را به درستی نمایش میدهد
در مثال بالا name یک رشته و age یک عدد صحیح بود که بدون مشکل در یک خط چاپ شدند.
الحاق رشتهها و متغیرها
روش دیگر برای خروجیگرفتن، الحاق (concatenate) متغیرها با رشتهها است. این کار توسط عملگر + انجام میشود. مثلاً:
x = "Python "
y = "is "
z = "awesome!"
print(x + y + z)
در اینجا عملگر + سه رشتهی x, y, z را به هم متصل کرده و نتیجه ("Python is awesome!") چاپ میشود
دقت کنید که برای خوانایی خروجی، خودمان یک فاصله در انتهای "Python " و "is " گنجاندهایم؛ در غیر این صورت کلمات به هم میچسبیدند
نکتهی مهم این روش آن است که تمام اجزایی که با + به هم متصل میکنید باید رشته باشند. اگر یکی از آنها عدد یا نوع دیگری باشد، با خطا مواجه میشوید
برای مثال، عبارت print("Age: " + age) در حالی که age عدد است، خطا میدهد. برای رفع این مشکل، میتوانید ابتدا عدد را با تابع str() به رشته تبدیل کنید یا از روشهای دیگر (مانند ویرگول در print یا قالببندی) استفاده کنید:
age = 20
print("Age: " + str(age)) # تبدیل عدد به رشته قبل از الحاق
با این کار، عدد 20 تبدیل به رشته "20" میشود و سپس الحاق صورت میگیرد و خروجی Age: 20 نمایش مییابد.
قالببندی خروجی با f-String و format
استفاده از ویرگول یا الحاق با + برای افزودن متغیرها به متن، در موارد ساده مناسب است. اما زمانی که بخواهیم یک رشتهی قالببندیشده (فرمتشده) نمایش دهیم یا ترکیبهای پیچیدهتری داشته باشیم، روشهای قالببندی رشته به کار میآیند. در پایتون مدرن، f-string ها راهکار قدرتمند و سادهای برای این منظور هستند
از نسخهی 3.6 به بعد، با قرار دادن حرف f در ابتدای یک رشته، میتوانید مستقیماً نام متغیرها را داخل آکولاد {} درون رشته قرار دهید تا مقادیرشان در همان محل درج شود
به عنوان مثال:
name = "Sara"
score = 95
print(f"Student {name} got a score of {score} on the exam.")
در رشتهی داخل print، دو جایخالی {} داریم که یکی name و دیگری score را در خود جای داده است. خروجی این دستور به شکل زیر خواهد بود:
Student Sara got a score of 95 on the exam.
مزیت f-string این است که کد شما را بسیار خوانا و شبیه به جملهی معمولی میکند و لازم نیست برای هر متغیر خاتمهی رشته را شکسته و دوباره الحاق کنید. همچنین داخل آکولاد میتوانید هر عبارت پایتونی قرار دهید، مثلاً محاسبات یا توابع. برای نمونه:
x = 5
y = 3
print(f"{x} + {y} = {x+y}")
این کد خروجی 5 + 3 = 8 را تولید میکند، چون عبارت x+y داخل آکولاد محاسبه شده و نتیجه (8) درج شده است.
روش قدیمیتر قالببندی استفاده از متد رشتهای ()format بود. به این صورت که در رشته به جای هر مقدار یک جفت آکولاد خالی {} قرار داده و سپس با فراخوانی "{}".format(val1, val2, ...) مقادیر مورد نظر را به ترتیب جایگزین میکردید. به عنوان مثال:
print("Student {} got a score of {}.".format(name, score))
خروجی مشابه قبل خواهد بود: Student Sara got a score of 95.. متد format امکان تنظیم فرمت نمایش (مثلاً تعداد اعشار برای اعداد اعشاری، یا طول فیلد و …) را میدهد. اما از آنجا که f-stringها خواناتر و مختصرتر هستند و کارایی بهتری نیز دارند، در نسخههای جدید بیشتر از f-string استفاده میشود
در صورتی که نیاز به قالببندی خیلی پیچیدهای ندارید، همان روش سادهی print(var1, var2, ...) با ویرگول کاملاً پاسخگو است
اما برای خروجی کاربرپسند یا ساخت رشتههای خروجی برای فایل و …، حتماً با قالببندی رشته (خصوصاً f-string) آشنا شوید.
نمونههای عملی نمایش خروجی
فرض کنید برنامهای مینویسید که اطلاعات یک فرد را گرفته و پیغامی خلاصه نمایش میدهد:
first_name = "Reza"
last_name = "Ahmadi"
birth_year = 1990
current_year = 2025
age = current_year - birth_year
print(f"{first_name} {last_name} is {age} years old in {current_year}.")
در این مثال، ابتدا سن فرد بر اساس سال تولد محاسبه شده و سپس با کمک f-string یک جمله حاوی نام کامل و سن ساخته و نمایش داده میشود. خروجی چیزی شبیه این خواهد بود:
Reza Ahmadi is 35 years old in 2025.
همانطور که میبینید، استفاده از قالببندی باعث شده ترکیب متن ثابت و متغیرها به سادگی انجام شود. این روش به ویژه در ساختن رشتههای طولانی یا تولید گزارشهای قالببندیشده بسیار سودمند است.
متغیرهای سراسری در پایتون (Global Variables)
تا اینجا دربارهی متغیرهایی صحبت کردیم که در یک قسمت از کد تعریف میشدند و از همان نقطه به بعد قابل استفاده بودند. حال میخواهیم مفهوم متغیر سراسری (global) و متغیر محلی (local) را بررسی کنیم. به طور خلاصه:
- متغیر سراسری متغیری است که بیرون از همهی توابع تعریف میشود و بنابراین در کل برنامه (هم در داخل توابع و هم در بیرون آنها) قابل دسترسی است
- متغیر محلی متغیری است که داخل یک تابع تعریف میشود و فقط در محدودهی همان تابع قابل استفاده است. به عبارت دیگر، عمر و حوزهی آن محدود به اجرای آن تابع است و در خارج از آن در دسترس نیست.
اجازه دهید ابتدا یک مثال ساده بزنیم:
x = "awesome" # متغیر سراسری
def my_func():
print("Python is " + x)
my_func() # خروجی: Python is awesome
print("Python is " + x) # خروجی: Python is awesome
در اینجا متغیر x بیرون از تابع تعریف شده و مقداری به آن داده شده است. سپس داخل تابع my_func بدون اینکه x را دوباره تعریف کنیم، از آن استفاده کردهایم. نتیجه نشان میدهد که تابع به متغیر سراسری x دسترسی داشته و مقدار آن ("awesome") را چاپ کرده است
همچنین در بیرون تابع نیز استفاده از x همان مقدار را میدهد. این تایید میکند که x یک متغیر سراسری است.
حال حالت دیگر را در نظر بگیریم: تعریف متغیری همنام در داخل تابع:
x = "awesome" # متغیر سراسری
def my_func():
x = "fantastic" # متغیر محلی با همان نام x
print("Python is " + x)
my_func() # خروجی داخل تابع: Python is fantastic
print("Python is " + x) # خروجی در بیرون تابع: Python is awesome
در این نمونه، ما داخل تابع my_func یک متغیر محلی به نام x تعریف کردیم و مقدار "fantastic" به آن دادیم. این متغیر فقط در محدودهی تابع وجود دارد. هنگام چاپ داخل تابع، مقدار محلی (fantastic) نمایش داده میشود، اما پس از اتمام تابع، متغیر محلی از بین میرود و x سراسری دستنخورده با مقدار اصلی خود باقی میماند
بنابراین خط پرینت بیرون تابع دوباره مقدار "awesome" را نشان میدهد. این مثال اهمیت حوزهی متغیرها را نشان میدهد: دو متغیر با نام یکسان میتوانند یکی سراسری و دیگری محلی باشند بیآنکه با هم تداخل داشته باشند؛ متغیر محلی سایهای روی متغیر سراسری میاندازد ولی فقط در محدودهی خودش.
حال سوالی که پیش میآید این است: اگر بخواهیم داخل یک تابع، متغیر سراسری را تغییر دهیم باید چه کار کنیم؟ به طور پیشفرض، وقتی داخل تابعی نام متغیری را که در خارج وجود دارد بنویسید، پایتون آن را فقط میخواند. اما اگر سعی کنید مقداری به آن نسبت دهید، پایتون به طور خودکار فرض میکند که میخواهید یک متغیر محلی جدید بسازید. برای مثال:
x = 0 # سراسری
def increment():
x = x + 1 # تلاش برای افزایش x
print(x)
increment()
کد فوق خطا خواهد داد (UnboundLocalError)، زیرا مفسر پایتون درون تابع increment میبیند که به نام x مقداردهی شده، پس آن را یک متغیر محلی در نظر میگیرد. سپس هنگام ارزیابی سمت راست x + 1 متوجه میشود متغیر محلی x هنوز مقداردهی اولیه نشده و خطا رخ میدهد. برای حل این مشکل، پایتون کلیدواژهی مخصوصی به نام global دارد. با اعلام یک نام به عنوان global داخل تابع، به پایتون میگوییم “از متغیر سراسری با این نام استفاده کن، نه یک متغیر محلی جدید”. به عنوان نمونه:
x = 0 # متغیر سراسری
def increment():
global x # اعلام اینکه از x سراسری استفاده شود
x = x + 1 # حال به متغیر سراسری مقدار جدید میدهیم
print(x)
increment() # خروجی: 1
print(x) # خروجی: 1 (مقدار x سراسری تغییر کرده است)
با استفاده از global x، تغییراتی که در تابع روی x میدهیم روی همان متغیر سراسری اعمال میشود
در مثال بالا پس از یک بار فراخوانی تابع، مقدار x سراسری از 0 به 1 افزایش یافته است.
پس global به ما امکان میدهد داخل یک تابع متغیر سراسری را ایجاد یا تغییر دهیم
البته کاربرد دیگر آن ایجاد متغیر سراسری جدید داخل تابع است، اما این کار کمتر توصیه میشود زیرا میتواند کد را پیچیده کند. معمولاً متغیرهای سراسری را در بالای اسکریپت تعریف میکنند تا به وضوح مشخص باشد کدام متغیرها global هستند.
نکات تکمیلی و حرفهای دربارهی متغیرهای سراسری
حوزه (Scope) متغیر تعیین میکند در کجای برنامه به آن دسترسی داریم. پایتون از یک سلسلهمراتب برای جستجوی متغیرها استفاده میکند (معروف به LEGB: Local, Enclosing, Global, Built-in). ابتدا متغیرهای محلی تابع جاری، سپس متغیرهای محلی توابع Outer (در صورت تو در تو بودن)، بعد متغیرهای سراسری و در نهایت متغیرهای توکار (مثل len, print, …) را جستجو میکند. به همین دلیل اگر نام متغیری هم به صورت محلی و هم سراسری وجود داشته باشد، همیشه نسخهی محلی در داخل تابع در اولویت است و جلوی دسترسی به سراسری را میگیرد.
چه زمانی از متغیر سراسری استفاده کنیم؟ متغیرهای سراسری برای دادههایی کاربرد دارند که در بخشهای مختلف برنامه به کار میروند و ماهیتی تقریباً ثابت یا تنظیماتی کلی دارند. به عنوان مثال، میتوانید یک متغیر سراسری برای پیکربندی برنامه (مانند مسیر یک پوشهی منابع یا یک ضریب ثابت) تعریف کنید تا در توابع مختلف از آن استفاده شود
یا در برنامههای کوچک و اسکریپتهای تکفایلی، استفاده از چند متغیر سراسری ساده (مثلاً جهت شمارش یا ذخیره وضعیت) مشکلساز نخواهد بود. حتی گاهی برای سادگی، متغیرهایی را سراسری تعریف میکنیم تا در چند تابع بدون پاس دادن آرگومان، قابل دسترس باشند.
با این حال، افراط در استفاده از متغیرهای سراسری توصیه نمیشود. استفادهی زیاد از globalها میتواند در برنامههای بزرگ باعث پیچیدگی و سختی اشکالزدایی شود، چون هر قسمت از کد میتواند مقدار آنها را تغییر دهد و ردگیری این تغییرات دشوار میگردد
. اصول برنامهنویسی ماژولار ایجاب میکند تا حد امکان متغیرهای خود را محلی نگه دارید و دادههای لازم را از طریق پارامترها به توابع ارسال کنید و نتیجه را به صورت خروجی برگردانید، به جای این که همه توابع بر متغیرهای سراسری مشترک تکیه کنند
این کار موجب میشود توابع شما مستقلتر و قابل فهمتر باشند و تستکردن آنها نیز آسانتر شود.
چند توصیه عملی درباره متغیرهای سراسری:
- متغیرهای سراسری را در بالای فایل برنامه تعریف کنید تا به راحتی قابل تشخیص باشند. اغلب برنامهنویسان بخش ابتدایی فایل را به تعریف ثابتها و تنظیمات اختصاص میدهند. مثلا:
MAX_RETRY = 5 # حداکثر تعداد تلاش مجاز
DEFAULT_COLOR = "blue"
timeout = 60
- در اینجا
MAX_RETRYوDEFAULT_COLORبه صورت ثابتهایی با حروف بزرگ تعریف شدهاند که نوعی متغیر سراسری محسوب میشوند (قرارداد حروف بزرگ اغلب برای ثابتهای تغییرناپذیر به کار میرود). متغیرtimeoutنیز یک تنظیم قابل تغییر سراسری است. - نامهای توصیفی برای globalها انتخاب کنید تا در صورت مشاهده در عمق کد، وظیفهشان واضح باشد
مثلاً
config_pathگویاست که مسیری را نگهداری میکند که احتمالاً مربوط به فایل پیکربندی است. - اگر متغیر سراسری شما واقعاً جنبهی ثابت دارد (قرار نیست تغییر کند)، میتوانید در نامگذاری از حروف بزرگ استفاده کنید تا دیگران بدانند نباید آن را تغییر دهند. هرچند پایتون مکانیزم جلوگیری از تغییر ثابتها را ندارد، این یک قرارداد بین برنامهنویسان است. مثلا:
PI = 3.14159 # ثابت ریاضی پی
- با این نامگذاری، انتظار میرود کسی در ادامهی کد مقدار
PIرا تغییر ندهد. - در صورت نیاز به تغییر یک متغیر سراسری در جای دور از محل تعریف آن، حتماً دقت کنید که این کار آیا اثرات جانبی در سایر بخشها دارد یا خیر. تغییر ناگهانی مقدار global میتواند روی توابعی که از آن استفاده میکنند تاثیر بگذارد و اگر از این وابستگی غافل شوید، پیدا کردن منشاء باگ سخت خواهد شد. لذا با احتیاط تغییر دهید و شاید بهتر باشد در مستندات یا کامنت ذکر کنید که “متغیر X اینجا تغییر داده میشود”.
در نهایت، متغیرهای سراسری ابزار قدرتمندی هستند که در جای صحیح خود میتوانند مفید باشند، اما مدیریت آنها نیازمند دقت و انضباط است. برای پروژههای بزرگتر، معمولاً طراحی به گونهای انجام میشود که نیاز به globalهای زیاد نباشد. اما دانستن نحوهی کار با آنها و محدوده اثرشان برای هر برنامهنویس ضروری است تا در مواجهه با کدهای دیگران یا نگهداری پروژههای موجود دچار سردرگمی نشود.
منابع : w3school realpython