مبانی زبان

متغیرها در پایتون: انتساب، نام‌گذاری و جابه‌جایی مقادیر

۴ دقیقه مطالعه · به‌روزرسانی ۲۲ مهر ۱۴۰۵

متغیر نامی است که به یک مقدار در حافظه وصل می‌شود تا بعداً با همان نام به آن مقدار دسترسی داشته باشیم.

انتساب با =

علامت = برای انتساب (assignment) است، نه برابری ریاضی:

pi = 3.14159
pi_approx = 22 / 7
print(pi, pi_approx)

در این مثال pi متغیر است و 3.14159 مقدار. پایتون انتساب را در دو قدم انجام می‌دهد:

  1. سمت راست را محاسبه می‌کند تا به یک مقدار برسد.
  2. آن مقدار را به نام سمت چپ وصل می‌کند.

برای همین x = x * x در ریاضی بی‌معناست، اما در برنامه‌نویسی کاملاً درست است: «مقدار فعلی x را در خودش ضرب کن و نتیجه را دوباره در x بگذار».

x = 2
x = x * x
y = x + 1
print(x, y)

تغییر اتصال (Rebinding)

می‌توانید با یک انتساب جدید، متغیر را به مقدار جدیدی وصل کنید:

pi = 3.14
radius = 2.2
area = pi * (radius ** 2)
radius = radius + 1
print(radius)  # 3.2
print(area)    # هنوز همان مساحت قبلی (حدود 15.1976) است!

دو نکتهٔ مهم در این مثال هست:

  • وقتی radius به 3.2 وصل می‌شود، مقدار قبلی (2.2) ممکن است هنوز در حافظه باشد، اما دیگر نامی به آن اشاره نمی‌کند و دسترسی به آن از دست رفته است. پایتون با سازوکاری به نام جمع‌آوری زباله (Garbage Collector) این مقدارهای بی‌صاحب را خودکار از حافظه پاک می‌کند. (در زبانی مثل C باید خودتان حافظه را آزاد کنید.)
  • مقدار area خودکار به‌روز نمی‌شود. (اینکه پایتون 15.197600000000003 چاپ می‌کند به‌جای 15.1976، به نحوهٔ ذخیرهٔ اعداد اعشاری در کامپیوتر برمی‌گردد و در درس جواب تقریبی توضیح داده شده.) متغیر یک فرمول نیست؛ فقط نتیجهٔ محاسبه در لحظهٔ اجرای آن خط را نگه می‌دارد. اگر مساحت جدید را می‌خواهید، باید آن خط را دوباره اجرا کنید.

نام‌گذاری متغیرها

قواعد اجباری

  • فقط از حروف، ارقام و زیرخط _ استفاده کنید و با رقم شروع نکنید: name2 درست است، 2name نه.
  • بزرگی و کوچکی حروف مهم است: Age و age دو متغیر جدا هستند.
  • کلمات کلیدی ممنوع‌اند. این کلمه‌ها برای خود زبان رزرو شده‌اند، مثل if، else، for، while، def، return، True، False، None، and، or، not، in، import.
import keyword
print(keyword.kwlist)

قواعد خوب (توصیه)

  • توصیفی و معنادار: age به‌جای a، number_of_repetition به‌جای n. کدی که خودش گویاست، کمتر به توضیح جداگانه نیاز دارد. شما شش ماه بعد از خودتان تشکر خواهید کرد!
  • در پایتون رسم است نام متغیر با حروف کوچک و کلمه‌ها با _ جدا شوند (snake_case): my_sum، is_prime.

⚠️ دام خطرناک: پایتون اجازه می‌دهد نام توابع آماده را برای متغیر استفاده کنید، اما با این کار آن تابع را خراب می‌کنید. اگر بنویسید str = "salam" یا sum = 0، از آن به بعد دیگر نمی‌توانید از تابع str() یا sum() استفاده کنید. نام‌هایی مثل list، str، sum، max، min، input، print و type را برای متغیر انتخاب نکنید.

sum = 10
print(sum([1, 2, 3]))   # TypeError: 'int' object is not callable

(در Jupyter اگر چنین اشتباهی کردید، با Kernel › Restart همه‌چیز به حالت اول برمی‌گردد.)

جابه‌جا کردن مقدار دو متغیر

می‌خواهیم مقدار x و y را با هم عوض کنیم. آیا این روش درست است؟

x = 1
y = 2
y = x
x = y
print(x, y)

نه! خروجی 1 1 است. در خط سوم مقدار 2 از دست می‌رود، چون y به 1 وصل می‌شود و دیگر هیچ نامی به 2 اشاره نمی‌کند.

روش کلاسیک: متغیر کمکی

در همهٔ زبان‌ها (C، ‏C++‎، جاوا و…) از یک متغیر موقت استفاده می‌شود تا مقدار قبلی گم نشود:

x = 1
y = 2
temp = y   # یک نسخه از y را نگه دار
y = x
x = temp
print(x, y)

روش پایتونی: انتساب هم‌زمان

پایتون اجازه می‌دهد این کار را در یک خط انجام دهید:

x = 1
y = 2
x, y = y, x
print(x, y)

این جادو نیست: پایتون اول سمت راست را کامل محاسبه می‌کند و یک تاپل (2, 1) می‌سازد، بعد مقادیرش را به ترتیب در x و y می‌گذارد. تاپل‌ها را در بخش ساختمان داده‌ها کامل می‌بینیم. با همین روش چند متغیر را هم‌زمان مقدار بدهید:

name, age, city = "سارا", 30, "تهران"
print(name, age, city)

تمرین

بدون اجرا بگویید در پایان مقدار a، b و c چیست:

a = 5
b = a
a = a + 1
c = a * b
a, b = b, a
print(a, b, c)
جواب

5 6 30. وقتی b = a اجرا می‌شود، b به همان عدد 5 وصل می‌شود. تغییر بعدی a (به 6) روی b اثری ندارد. بعد c = 6 * 5 = 30 و در آخر جای a و b عوض می‌شود.