شرح المتغيرات وأنواع البيانات في بايثون بالتفصيل
ما هو المتغير في بايثون وكيف تعرّفه بالشكل الصحيح

المتغير في بايثون هو اسم يشير إلى موقع في الذاكرة يخزّن فيه قيمة معينة، وما يميز بايثون أنك لا تحتاج إلى تحديد نوع المتغير عند تعريفه كما هو الحال في C أو Java — المفسّر يستنتج النوع تلقائيًا من القيمة المسندة. لتعريف متغير صحيح في بايثون، اتبع هذه القواعد: ١- ابدأ الاسم بحرف أو شرطة سفلية (_) وليس برقم. ٢- استخدم فقط الحروف اللاتينية والأرقام والشرطة السفلية، فالمسافات والرموز الخاصة غير مسموح بها. ٣- تجنب الكلمات المحجوزة في بايثون مثل if وfor وclass وreturn وغيرها، إذ يبلغ عددها 35 كلمة في بايثون 3. ٤- اعتمد نمط snake_case كالتالي: user_age أو total_price بدلًا من camelCase، وهو النمط الرسمي الموصى به في معيار PEP 8.
عملية الإسناد في بايثون تتم بعلامة = الواحدة، وتستطيع إسناد قيم متعددة في سطر واحد بطريقتين: إما x, y, z = 1, 2, 3 لإسناد قيم مختلفة لكل متغير، أو x = y = z = 0 لإسناد نفس القيمة لعدة متغيرات دفعة واحدة. كذلك يمكن تحديث قيمة متغير موجود بالكتابة فوقه مباشرة دون الحاجة لأي تعريف جديد، فبايثون تلغي الإشارة القديمة في الذاكرة وتنشئ إشارة جديدة للقيمة المحدثة — وهذا السلوك مرتبط بآلية إدارة الذاكرة عبر العد المرجعي (Reference Counting) التي يعتمدها المفسّر.
الأنواع البدائية: int وfloat وstr وbool — الفرق بينها ومتى تستخدم كل منها
النوع int يخزن الأعداد الصحيحة بدون كسور مثل 5 أو -200 أو 1000000، وهو الاختيار الطبيعي لعمليات العد والفهرسة والحلقات. أما float فيخزن الأعداد العشرية مثل 3.14 أو -0.5، لكن انتبه أن بايثون يمثّل بعض قيم float بدقة تقريبية بسبب طريقة تخزين IEEE 754 للأرقام العشرية في الذاكرة، فمثلاً الناتج الفعلي لـ 0.1 + 0.2 في بايثون هو 0.30000000000000004 وليس 0.3 بالضبط، وهذا يؤثر في المقارنات الرياضية الدقيقة.
النوع str يمثّل النصوص، وكل قيمة str في بايثون هي سلسلة من الأحرف يمكن الوصول إليها بالفهرس مثل name[0]، وهو نوع غير قابل للتعديل بعد الإنشاء (immutable)، بمعنى أن أي عملية تعديل على النص تُنشئ كائنًا جديدًا في الذاكرة بدلاً من تعديل الأصلي. النوع bool يحمل قيمتين فقط: True أو False، وهو في الحقيقة نوع فرعي من int في بايثون، لذلك True == 1 و False == 0 تعطيان نتيجة صحيحة، وهذا يعني أنك تستطيع استخدام قيم bool مباشرة في العمليات الحسابية مثل True + True التي تُعطي 2، وهو سلوك يستغله بعض المبرمجين لكنه قد يُربك قراءة الكود إذا أُسيء استخدامه.
الأنواع المركبة: list وtuple وdict وset — الفروقات العملية بين كل نوع
الـlist هي المجموعة القابلة للتعديل في بايثون، تُكتب بأقواس مربعة مثل my_list = [1, 2, 3]، ويمكن إضافة عناصر إليها أو حذفها أو تعديلها بعد الإنشاء. في المقابل، الـtuple تُكتب بأقواس عادية مثل my_tuple = (1, 2, 3) وهي ثابتة تمامًا بعد الإنشاء، مما يجعلها أسرع في القراءة وأقل استهلاكًا للذاكرة من الـlist — وفقًا لتوثيق W3Schools فإن الـtuple تُفضَّل عندما تحتاج مجموعة بيانات لن تتغير كإحداثيات نقطة (x, y) أو قيم ثابتة كأيام الأسبوع.
الـdict تُخزّن البيانات كأزواج مفتاح-قيمة وتُكتب هكذا: my_dict = {'name': 'Ahmed', 'age': 25}، والوصول إلى أي قيمة يتم عبر مفتاحها مباشرةً لا عبر رقم موضعها، مما يجعلها الخيار الأمثل لتمثيل كيانات لها خصائص متعددة. أما الـset فتُكتب بأقواس معقوصة مثل my_set = {1, 2, 3} لكن بدون مفاتيح، وتتميز بخاصيتين جوهريتين: لا تقبل قيمًا مكررة أبدًا، وعناصرها غير مرتبة، لذا تُستخدم تحديدًا لإزالة التكرار من قائمة موجودة أو لعمليات المقارنة بين مجموعتين كالتقاطع والاتحاد.
الفرق العملي يمكن اختصاره في معيارين: قابلية التعديل وطريقة الوصول. الـlist والـdict والـset قابلة للتعديل بعد الإنشاء (mutable)، بينما الـtuple ثابتة (immutable). أما طريقة الوصول فتختلف كالتالي: الـlist والـtuple تعتمدان على الفهرس الرقمي (index) بدءًا من 0، والـdict تعتمد على المفتاح النصي أو الرقمي، والـset لا تدعم الوصول المباشر لعنصر بعينه لأن عناصرها غير مرتبة. اختيار النوع الخطأ في سياق معين — كاستخدام list بدل set للتحقق من تكرار عناصر ضمن ملايين السجلات — يؤثر على أداء الكود بشكل ملموس.
الكتابة الديناميكية في بايثون ودالة type() لمعرفة نوع المتغير
بايثون لغة ذات كتابة ديناميكية (Dynamic Typing)، وهذا يعني أن المتغير لا يُربط بنوع بيانات محدد عند تعريفه، بل يأخذ نوعه تلقائيًا من القيمة المسندة إليه، ويمكن أن يتغير هذا النوع لاحقًا في نفس البرنامج. فمثلًا، المتغير x = 10 يصبح من نوع int، لكن بعد كتابة x = 'مرحبا' في السطر التالي يتحول مباشرةً إلى str دون أي إعلان أو تحويل صريح. هذه المرونة تُسرّع الكتابة الأولية للكود، لكنها تزيد احتمالية وقوع أخطاء منطقية صعبة الاكتشاف في المشاريع الكبيرة، لأن المترجم لن يُنبّهك إن أسندت نوعًا غير متوقع لمتغير.
الدالة type() هي الأداة المباشرة للتحقق من نوع أي متغير في وقت التشغيل (Runtime)، وتُعيد كائنًا يمثل النوع لا نصًا. كتابة type(x) تُعيد مثلًا <class 'int'> أو <class 'str'>. وللمقارنة الدقيقة داخل الكود، يُستخدم التعبير type(x) == int بدلًا من الاعتماد على قراءة المخرج فقط. أما الدالة isinstance() فتختلف في أنها تتحقق إن كان المتغير ينتمي إلى نوع معين أو إلى أي من أنواع موروثة منه، وهي الخيار الأدق في الكود الاحترافي عند التحقق من التوافق بين أنواع متعددة في آنٍ واحد، مثل isinstance(x, (int, float)).
تحويل أنواع البيانات (Type Casting) والأخطاء الشائعة عند الخلط بينها
تحويل أنواع البيانات في بايثون يتم عبر دوال مدمجة مثل int() وfloat() وstr() وbool(). مثلاً، int("42") تحوّل النص "42" إلى عدد صحيح قابل للعمليات الحسابية، بينما str(99) تحوّل العدد إلى نص مفيد عند الدمج مع سلاسل أخرى. التحويل من float إلى int يحذف الكسر العشري دون تقريب، فـ int(3.9) تُعطي 3 وليس 4، وهذا سلوك متعمد في اللغة. أما bool() فتعيد False لأي قيمة تساوي صفرًا أو نصًا فارغًا أو قائمة فارغة، وTrue لأي قيمة أخرى.
أشيع الأخطاء الناتجة عن الخلط بين الأنواع هي ثلاثة: أولاً TypeError عند محاولة جمع نص وعدد مباشرةً مثل "العمر: " + 25 بدل "العمر: " + str(25). ثانياً ValueError عند تمرير نص غير رقمي لدالة int() مثل int("مرحبا") مما يوقف البرنامج فورًا. ثالثاً نتائج غير متوقعة عند مقارنة قيم من أنواع مختلفة، إذ أن 1 == True يُعطي True لأن بايثون تعامل bool كنوع فرعي من int، لكن "1" == 1 يُعطي False لأن المقارنة تشمل النوع ضمنيًا. التحقق من نوع المتغير قبل إجراء التحويل باستخدام isinstance() يتجنب هذه الأخطاء الثلاثة في معظم الحالات.
المصادر
- أنواع المتغيرات في بايثون — harmash
- المتغيرات في بايثون — devarabi
- أنواع البيانات والعمليات الأساسية في بايثون — أكاديمية حسوب
- Python Data Types — W3Schools
الرجاء تسجيل الدخول لتتمكن من التعليق