المتغيرات في بايثون (Python Variables)

المتغيرات (Variables) هي أحد أهم المفاهيم الأساسية في البرمجة بشكل عام، وفي بايثون بشكل خاص. يمكنك تشبيه المتغير بصندوق أو حاوية تخزن فيها قيمة معينة (رقم، نص، قائمة، إلخ) وتعطيها اسماً لتتمكن من الوصول إليها واستخدامها لاحقاً في برنامجك. بدون المتغيرات، لن تستطيع حفظ البيانات أو معالجتها أو نقلها بين أجزاء البرنامج المختلفة. في هذا الدرس الشامل والمفصل، سنتعلم كل ما تحتاج معرفته عن المتغيرات في بايثون: كيفية إنشائها، قواعد تسميتها، أنواعها، كيفية تغيير قيمها، والعديد من الأمثلة العملية التي ستجعلك تفهم هذا المفهوم بعمق.

1. ما هو المتغير؟ (تشبيه من الحياة اليومية)

تخيل أن لديك خزانة ملابس في غرفتك. هذه الخزانة لها اسم (مثلاً "خزانة الملابس الشتوية")، وبداخلها محتويات (معاطف، سترات، إلخ). عندما تريد استخدام معطفك، لا تقول "أريد الشيء الموجود في الدرج الثالث من الخزانة الخشبية بجانب النافذة"، بل تقول ببساطة "أريد معطفي من خزانة الملابس الشتوية". الاسم "خزانة الملابس الشتوية" يشير إلى مكان محدد يحتوي على أشياء محددة.

المتغير في البرمجة يعمل بنفس الطريقة تماماً. هو اسم رمزي (مثل age أو name أو total_price) يشير إلى موقع في ذاكرة الحاسوب يحتوي على قيمة معينة. بدلاً من أن تتذكر عنوان الذاكرة المعقد (مثل 0x7fff5fbff8a0)، تستخدم اسماً بسيطاً وواضحاً.

في بايثون، المتغير ليس مجرد صندوق يحتوي على قيمة، بل هو أشبه بـ "ملصق" أو "بطاقة تعريف" تلصقها على قيمة موجودة في الذاكرة. هذا الفرق الدقيق مهم ولكن لا تقلق إذا لم تفهمه الآن، سيصبح واضحاً مع الممارسة.

2. إنشاء المتغيرات في بايثون

في بايثون، إنشاء متغير سهل للغاية. لا تحتاج لإعلان نوع المتغير مسبقاً (كما في لغات مثل C++ أو Java)، ولا تحتاج لكلمات مفتاحية خاصة مثل var أو let. فقط اكتب اسم المتغير، ثم علامة المساواة = (تُسمى عامل التعيين Assignment Operator)، ثم القيمة التي تريد تخزينها.

creating_variables.py
# إنشاء متغيرات بأنواع مختلفة
name = "أحمد"           # متغير يحتوي على نص (String)
age = 25                # متغير يحتوي على رقم صحيح (Integer)
height = 1.75           # متغير يحتوي على رقم عشري (Float)
is_student = True       # متغير يحتوي على قيمة منطقية (Boolean)

# استخدام المتغيرات
print("الاسم:", name)
print("العمر:", age)
print("الطول:", height)
print("طالب؟", is_student)
النتيجة
الاسم: أحمد العمر: 25 الطول: 1.75 طالب؟ True

في المثال أعلاه، أنشأنا أربعة متغيرات مختلفة. بايثون ذكية بما يكفي لمعرفة نوع البيانات تلقائياً من القيمة التي أعطيتها للمتغير. هذه الميزة تُسمى "الكتابة الديناميكية" (Dynamic Typing).

تغيير قيمة المتغير

يمكنك تغيير قيمة المتغير في أي وقت ببساطة بإعادة تعيين قيمة جديدة له:

changing_values.py
# إنشاء متغير
score = 50
print("النقاط الأولية:", score)

# تغيير قيمة المتغير
score = 75
print("النقاط بعد التحديث:", score)

# يمكنك حتى تغيير نوع البيانات!
score = "ممتاز"
print("التقييم النهائي:", score)
النتيجة
النقاط الأولية: 50 النقاط بعد التحديث: 75 التقييم النهائي: ممتاز

3. قواعد تسمية المتغيرات

ليس كل اسم صالح ليكون اسم متغير في بايثون. هناك قواعد صارمة يجب اتباعها، وإرشادات موصى بها لكتابة أسماء واضحة واحترافية:

القواعد الإلزامية (يجب اتباعها وإلا ستحصل على خطأ)
  • يجب أن يبدأ بحرف (a-z, A-Z) أو شرطة سفلية (_): لا يمكن أن يبدأ برقم.
  • يمكن أن يحتوي على حروف، أرقام، وشرطات سفلية فقط: لا رموز خاصة مثل @, #, $, %, إلخ.
  • حساس لحالة الأحرف (Case-Sensitive): name و Name و NAME ثلاثة متغيرات مختلفة.
  • لا يمكن استخدام الكلمات المحجوزة (Keywords): مثل if, for, while, class, إلخ.
naming_rules.py
# ✅ أسماء صحيحة
name = "أحمد"
age = 25
user_name = "ahmed123"
_private = "قيمة خاصة"
firstName = "محمد"
total_price_2024 = 1500

# ❌ أسماء خاطئة (ستسبب أخطاء)
# 2name = "خطأ"           # يبدأ برقم
# user-name = "خطأ"       # يحتوي على شرطة
# user name = "خطأ"       # يحتوي على مسافة
# for = 5                 # كلمة محجوزة
# user@email = "خطأ"      # يحتوي على رمز خاص

# حساسية حالة الأحرف
name = "أحمد"
Name = "محمد"
NAME = "علي"
print(name, Name, NAME)  # ثلاثة متغيرات مختلفة!
النتيجة
أحمد محمد علي
الإرشادات الموصى بها (Best Practices)
  • استخدم أسماء واضحة ومعبرة: student_age أفضل من sa أو x
  • استخدم snake_case للمتغيرات: total_price بدلاً من totalPrice أو TotalPrice
  • استخدم أسماء بالإنجليزية: رغم أن بايثون تدعم Unicode، إلا أن الإنجليزية هي المعيار العالمي
  • تجنب الأسماء المكونة من حرف واحد: إلا في حالات محددة (مثل i في الحلقات)
  • استخدم الشرطة السفلية للأرقام الكبيرة: 1_000_000 أوضح من 1000000
good_naming.py
# ❌ أسماء سيئة (تعمل لكنها غير واضحة)
a = 25
x = "أحمد"
temp = 1500

# ✅ أسماء جيدة (واضحة ومعبرة)
student_age = 25
student_name = "أحمد"
total_price = 1500

# ✅ استخدام الشرطة السفلية للأرقام الكبيرة
population = 1_500_000  # أسهل في القراءة من 1500000
budget = 10_000_000

print(f"عدد السكان: {population:,}")
print(f"الميزانية: {budget:,}")
النتيجة
عدد السكان: 1,500,000 الميزانية: 10,000,000

4. التعيين المتعدد (Multiple Assignment)

بايثون توفر طرقاً ذكية لتعيين قيم لعدة متغيرات في سطر واحد، مما يجعل الكود أكثر إيجازاً ووضوحاً:

تعيين نفس القيمة لعدة متغيرات
same_value.py
# تعيين نفس القيمة لثلاثة متغيرات
x = y = z = 0

print("x =", x)
print("y =", y)
print("z =", z)

# مفيد عند تهيئة عدة متغيرات بنفس القيمة الابتدائية
score1 = score2 = score3 = 100
print(f"النقاط: {score1}, {score2}, {score3}")
النتيجة
x = 0 y = 0 z = 0 النقاط: 100, 100, 100
تعيين قيم مختلفة لعدة متغيرات (Unpacking)
unpacking.py
# تعيين قيم مختلفة في سطر واحد
name, age, city = "أحمد", 25, "القاهرة"

print("الاسم:", name)
print("العمر:", age)
print("المدينة:", city)

# مفيد جداً لتبديل قيم متغيرين
a = 10
b = 20
print(f"قبل التبديل: a = {a}, b = {b}")

# التبديل في سطر واحد!
a, b = b, a
print(f"بعد التبديل: a = {a}, b = {b}")

# يمكنك فك حزم القوائم
coordinates = [100, 200, 300]
x, y, z = coordinates
print(f"الإحداثيات: x={x}, y={y}, z={z}")
النتيجة
الاسم: أحمد العمر: 25 المدينة: القاهرة قبل التبديل: a = 10, b = 20 بعد التبديل: a = 20, b = 10 الإحداثيات: x=100, y=200, z=300

5. الثوابت في بايثون (Constants)

الثابت (Constant) هو متغير قيمته لا يجب أن تتغير أثناء تنفيذ البرنامج. في الحقيقة، بايثون لا تمتلك ثوابت حقيقية (على عكس لغات أخرى)، لكن هناك اتفاقية بين المبرمجين: إذا كتبت اسم المتغير بأحرف كبيرة فقط (UPPERCASE)، فهذا يعني أنه ثابت ولا يجب تغييره.

constants.py
# تعريف ثوابت (بأحرف كبيرة)
PI = 3.14159
GRAVITY = 9.8
MAX_USERS = 100
TAX_RATE = 0.15
COMPANY_NAME = "شركة التقنية المتقدمة"

# استخدام الثوابت
radius = 5
area = PI * radius ** 2
print(f"مساحة الدائرة: {area:.2f}")

price = 1000
total_with_tax = price + (price * TAX_RATE)
print(f"السعر مع الضريبة: {total_with_tax}")

# تقنياً يمكنك تغيير "الثابت" لكن هذا غير محبذ
# PI = 3.14  # ❌ لا تفعل هذا!
النتيجة
مساحة الدائرة: 78.54 السعر مع الضريبة: 1150.0

6. نطاق المتغيرات (Variable Scope)

نطاق المتغير (Scope) يحدد أين يمكن الوصول إلى المتغير واستخدامه في البرنامج. هناك نوعان رئيسيان من النطاق:

المتغيرات المحلية (Local Variables)

المتغير المحلي هو متغير يُعرّف داخل دالة، ويمكن الوصول إليه فقط داخل تلك الدالة:

local_variables.py
def calculate_area():
    # length هو متغير محلي - موجود فقط داخل هذه الدالة
    length = 10
    width = 5
    area = length * width
    print(f"المساحة داخل الدالة: {area}")

# استدعاء الدالة
calculate_area()

# ❌ هذا سيسبب خطأ لأن length غير موجود خارج الدالة
# print(length)  # NameError: name 'length' is not defined
النتيجة
المساحة داخل الدالة: 50
المتغيرات العامة (Global Variables)

المتغير العام هو متغير يُعرّف خارج جميع الدوال، ويمكن الوصول إليه من أي مكان في البرنامج:

global_variables.py
# متغير عام - يمكن الوصول إليه من أي مكان
company_name = "شركة التقنية"
tax_rate = 0.15

def calculate_price(base_price):
    # يمكننا قراءة المتغيرات العامة داخل الدالة
    tax = base_price * tax_rate
    total = base_price + tax
    print(f"الشركة: {company_name}")
    print(f"السعر الأساسي: {base_price}")
    print(f"الضريبة: {tax}")
    print(f"الإجمالي: {total}")

calculate_price(1000)

# يمكننا أيضاً الوصول للمتغيرات العامة خارج الدالة
print(f"\nاسم الشركة: {company_name}")
النتيجة
الشركة: شركة التقنية السعر الأساسي: 1000 الضريبة: 150.0 الإجمالي: 1150.0 اسم الشركة: شركة التقنية

7. مثال شامل: نظام إدارة طالب

لنجمع كل ما تعلمناه في مثال عملي واقعي:

student_management.py
"""
نظام إدارة معلومات الطالب
يوضح استخدام المتغيرات بأنواعها المختلفة
"""

# ثوابت النظام (UPPERCASE)
PASSING_GRADE = 50
MAX_GRADE = 100
UNIVERSITY_NAME = "جامعة التقنية"

# معلومات الطالب (snake_case)
student_id = 12345
student_name = "أحمد محمد"
student_age = 20
is_enrolled = True
gpa = 3.75

# درجات المواد
math_grade = 85
physics_grade = 78
chemistry_grade = 92
programming_grade = 95

# حساب المعدل
total_grades = math_grade + physics_grade + chemistry_grade + programming_grade
average_grade = total_grades / 4

# تحديد حالة النجاح
passed = average_grade >= PASSING_GRADE

# عرض التقرير
print("=" * 60)
print(f"{'تقرير الطالب':^60}")
print("=" * 60)
print()

print(f"الجامعة: {UNIVERSITY_NAME}")
print(f"الرقم الجامعي: {student_id}")
print(f"الاسم: {student_name}")
print(f"العمر: {student_age} سنة")
print(f"مسجل: {'نعم' if is_enrolled else 'لا'}")
print(f"المعدل التراكمي: {gpa}")
print()

print("الدرجات:")
print("-" * 60)
print(f"  الرياضيات:    {math_grade}/{MAX_GRADE}")
print(f"  الفيزياء:     {physics_grade}/{MAX_GRADE}")
print(f"  الكيمياء:     {chemistry_grade}/{MAX_GRADE}")
print(f"  البرمجة:      {programming_grade}/{MAX_GRADE}")
print("-" * 60)
print(f"  المجموع:      {total_grades}/{MAX_GRADE * 4}")
print(f"  المعدل:       {average_grade:.2f}")
print()

# تحديد التقدير
if average_grade >= 90:
    grade_letter = "A"
    grade_text = "ممتاز"
elif average_grade >= 80:
    grade_letter = "B"
    grade_text = "جيد جداً"
elif average_grade >= 70:
    grade_letter = "C"
    grade_text = "جيد"
elif average_grade >= PASSING_GRADE:
    grade_letter = "D"
    grade_text = "مقبول"
else:
    grade_letter = "F"
    grade_text = "راسب"

print(f"التقدير: {grade_letter} ({grade_text})")
print(f"الحالة: {'ناجح ✓' if passed else 'راسب ✗'}")
print()
print("=" * 60)
النتيجة
============================================================ تقرير الطالب ============================================================ الجامعة: جامعة التقنية الرقم الجامعي: 12345 الاسم: أحمد محمد العمر: 20 سنة مسجل: نعم المعدل التراكمي: 3.75 الدرجات: ------------------------------------------------------------ الرياضيات: 85/100 الفيزياء: 78/100 الكيمياء: 92/100 البرمجة: 95/100 ------------------------------------------------------------ المجموع: 350/400 المعدل: 87.50 التقدير: B (جيد جداً) الحالة: ناجح ✓ ============================================================
💡 نصائح مهمة للمبتدئين
  • اختر أسماء متغيرات واضحة ومعبرة - الكود يُقرأ أكثر مما يُكتب
  • استخدم snake_case للمتغيرات العادية و UPPERCASE للثوابت
  • لا تخف من استخدام أسماء طويلة إذا كانت أكثر وضوحاً
  • تجنب استخدام أسماء مثل l (حرف L صغير) أو O (حرف O كبير) لأنها تشبه الأرقام 1 و 0
  • المتغيرات في بايثون ديناميكية - يمكنها تغيير نوعها، لكن هذا قد يسبب ارتباكاً

الخطوة التالية

الآن بعد أن فهمت المتغيرات، حان وقت التعمق في أنواع البيانات المختلفة

الدرس التالي: أنواع البيانات في Python
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن