ما هو المتغير (Variable)؟
المتغير (variable) في البرمجة مكان في الذاكرة له اسم، يخزّن قيمة يستطيع البرنامج قراءتها وتغييرها أثناء عمله. والاسم، مثل score أو user_name، يتيح للكود الإشارة إلى القيمة دون أن يعرف مكان تخزينها.
آخر تحديث 24 سبتمبر 2026
اللعبة التي تحسب النقاط تحتاج إلى تذكّر رقم، والإضافة إليه، وعرضه في النهاية. لا يمكن كتابة هذا الرقم داخل الكود، لأنه يختلف في كل مرة يلعب فيها أحد. لذلك يحجز البرنامج مكانًا في الذاكرة، ويعطيه اسمًا مثل score، ويستخدم هذا الاسم كلما احتاج إلى القيمة الحالية.
كيف يعمل المتغير
تمر على المتغير ثلاثة أشياء خلال البرنامج:
- الإنشاء. يحجز البرنامج ذاكرة لقيمة ويربط بها اسمًا. في Python يحدث ذلك أول مرة تُسند فيها قيمة إلى الاسم. أما في Java وC فتعلن عن المتغير أولًا مع نوعه، مثل
int score;. - الإسناد. تُخزَّن قيمة تحت الاسم باستخدام
=. والإسناد مرة أخرى يستبدل القيمة القديمة. - الاستخدام. أينما ظهر الاسم في تعبير، يقرأ البرنامج القيمة التي يحملها في تلك اللحظة.
Start: 0
After one point: 10
Doubled: 20
في كل سطر إسناد، يُحسب الطرف الأيمن أولًا باستخدام قيمة score في تلك اللحظة. ثم تُخزَّن النتيجة من جديد تحت الاسم نفسه. الاسم يبقى كما هو، والقيمة التي يحملها تتغير.
علامة يساوي تعني "خزّن"
في الرياضيات، المعادلة x = x + 1 ليس لها حل. أما في البرنامج فهي تعليمة عادية: خذ قيمة x الحالية، أضف إليها 1، وخزّن النتيجة في x. العلامة = هي عامل الإسناد، وهي تنقل دائمًا قيمة من الطرف الأيمن إلى الاسم في الطرف الأيسر.
وللسؤال عن تساوي قيمتين، تستخدم لغات البرمجة عاملًا مختلفًا هو ==. التعبير x == 5 لا يغيّر شيئًا؛ إنه يُنتج True أو False، أي قيمة منطقية (boolean).
المعنى الرياضي قريب لكنه ليس نفسه. في الجبر، يرمز x في 2x + 3 = 7 إلى عدد مجهول واحد تبحث عن قيمته. أما في البرنامج، فالمتغير يحمل قيمة معروفة يمكن أن تتغير أثناء عمل البرنامج.
المتغيرات وأنواع البيانات
لكل قيمة نوع: عدد صحيح، أو عدد عشري، أو نص، أو قيمة منطقية، أو قائمة. وتختلف اللغات في ما إذا كان للمتغير نفسه نوع.
في Python وJavaScript، القيمة هي التي تحمل النوع، ويمكن لمتغير واحد أن يحمل قيمًا من أنواع مختلفة بمرور الوقت. ويُسمّى هذا التحديد الديناميكي للنوع (dynamic typing):
42 <class 'int'>
forty-two <class 'str'>
أما في Java وC وC++، فللمتغير نوع ثابت يُحدَّد عند الإعلان عنه. وهذا هو التحديد الثابت للنوع (static typing): يرفض المترجم الكود الذي يحاول تخزين نص في متغير من نوع int، قبل أن يعمل البرنامج أصلًا.
int age = 30; // Java: type, name, value
String name = "Rosa";
let age = 30; // JavaScript: can be reassigned
const PI = 3.14159; // cannot be reassigned
وفي C يحدد النوع أيضًا مقدار الذاكرة التي يشغلها المتغير. يشغل int أربعة بايتات في كل الأنظمة الحالية تقريبًا، وdouble ثمانية، وchar بايتًا واحدًا بالضبط. ولتحتفظ بقيم كثيرة تحت اسم واحد، مثل كل نتائج اللعبة، تستخدم مصفوفة أو قائمة وتصل إلى كل قيمة بموقعها، مثل scores[0].
صناديق وملصقات
من الصور الشائعة للمتغير أنه صندوق يحمل قيمة. وهذه الصورة تناسب C جيدًا: int x; هو فعلًا مساحة ثابتة من الذاكرة، وy = x; ينسخ القيمة إلى مساحة ثانية.
أما Python فتعمل أشبه بالملصقات. كل قيمة كائن، والمتغير اسم ملصق على كائن. ويظهر الفرق عندما يشير اسمان إلى القائمة نفسها:
5 6
[1, 2, 3, 4]
مع الأعداد، ينشئ y = y + 1 عددًا جديدًا وينقل الملصق y إليه، فيبقى x مشيرًا إلى 5. أما مع القائمة، فإن b = a لا ينسخ شيئًا: الاسمان يشيران إلى قائمة واحدة، فالتغيير الذي يحدث عبر b يظهر عبر a. اكتب b = a.copy() عندما تريد قائمة منفصلة. والكائنات والمصفوفات في Java وJavaScript تتصرف بالطريقة نفسها.
النطاق: أين يوجد المتغير
المتغير مرئي في جزء من البرنامج فقط، يُسمّى نطاقه (scope). المتغير الذي يُنشأ داخل دالة متغير محلي: يوجد أثناء عمل الدالة ويختفي عندما تعود. أما المتغير الذي يُنشأ في المستوى الأعلى من الملف فهو متغير عام، ويمكن قراءته في أي مكان من ذلك الملف.
المتغيرات المحلية أسهل في الفهم، لأن كل سطر يمكن أن يغيّرها موجود داخل دالة واحدة. والبرامج التي تعتمد على متغيرات عامة كثيرة أصعب في تتبّع أخطائها للسبب المعاكس.
تسمية المتغيرات
الأسماء الجيدة تقول ما تعنيه القيمة: total_price وis_logged_in وretries_left. ومعظم اللغات تشترك في القواعد نفسها:
- يتكوّن الاسم من حروف وأرقام وشرطات سفلية، ولا يجوز أن يبدأ برقم؛
- لا يجوز أن يكون الاسم كلمة محجوزة في اللغة، مثل
ifأوforأوclass؛ - الأسماء حساسة لحالة الأحرف، فـ
totalوTotalمتغيران مختلفان.
ويختلف الأسلوب حسب اللغة. تستخدم Python أسلوب snake_case (user_name)، بينما تستخدم Java وJavaScript أسلوب camelCase (userName). والقيم التي يجب ألا تتغير أبدًا تُسمّى غالبًا بحروف كبيرة، مثل MAX_SIZE.
أخطاء شائعة
استخدام متغير قبل أن تكون له قيمة. تتوقف Python مع NameError:
NameError: name 'total' is not defined
ويظهر الخطأ نفسه عند كتابة الاسم بشكل خاطئ، لأن totla وtotal اسمان مختلفان بالنسبة للحاسوب.
كتابة = وأنت تقصد ==. في Python، if x = 5: خطأ في الصياغة، فتكتشفه فورًا. أما في C وJavaScript، فإن if (x = 5) كود صالح: يخزّن 5 في x، ويكون الشرط صحيحًا دائمًا. يعمل البرنامج ويعطي نتائج خاطئة، وهذا خطأ منطقي قد يستغرق وقتًا طويلًا لاكتشافه.
إعطاء متغير واحد مهمتين. المتغير الذي يحمل سعرًا في أعلى الدالة وعددًا في أسفلها سيظل يعمل، لكن كل من يقرأ الكود مضطر لتتبّع المعنى الحالي. أعطِ كل معنى اسمه الخاص.
إلى أين بعد ذلك
المتغيرات تحمل القيم، والخطوة التالية هي معرفة أنواع القيم الموجودة: اقرأ ما هي القيمة المنطقية لقيمتي الصواب والخطأ، وما هي المصفوفة لقيم كثيرة تحت اسم واحد. ويشرح دليل المتغيرات في Python الإسناد وقواعد التسمية والإسناد المتعدد بتفصيل أكبر، وتجعلك دورة Python تكتب المتغيرات وتغيّرها منذ الدرس الأول.
الأسئلة الشائعة
ما هو المتغير في Python؟
age = 30، دون الإعلان عن نوعه، ويمكن للاسم نفسه أن يشير لاحقًا إلى قيمة من نوع آخر. والاصطلاح المتبع أن تُكتب أسماء المتغيرات في Python بأسلوب snake_case.ما هو التعريف البسيط للمتغير؟
كيف أشرح المتغير لطفل؟
score، والصندوق يحمل شيئًا واحدًا في كل مرة. تستطيع أن تنظر داخله لترى ما فيه، أو تخرجه وتضع شيئًا جديدًا مكانه، ويبقى الملصق كما هو.ما الفرق بين المتغير والثابت؟
final، وتستخدم JavaScript وC الكلمة const. ولا توجد في Python ثوابت يفرضها المفسر، لذا يكتب المبرمجون الاسم بحروف كبيرة، مثل MAX_USERS، للإشارة إلى أنه لا ينبغي تغييره.