الفرق بين Python Tuple و List: متى تستخدم كل نوع بيانات؟

دقائق القراءة: 6

مقدمة: لماذا من المهم فهم الفرق بين Tuple و List في Python؟

تُعد Tuple وList من أشهر هياكل البيانات المدمجة في Python، ويعتمد عليهما المطورون كثيراً لتخزين البيانات وتنظيمها. وقد يبدوان متشابهين في البداية لأن كليهما يسمح بتجميع عدة عناصر داخل متغير واحد، لكن الفرق الحقيقي بينهما يظهر عند التعامل مع قابلية التعديل، وطبيعة الاستخدام، والمرونة داخل التطبيق.

في هذا الدليل التقني، سنشرح بشكل واضح أوجه التشابه والاختلاف بين Tuple وList، مع أمثلة عملية تساعدك على اختيار النوع المناسب في مشروعك البرمجي.

مقارنة تقنية بين Tuple و List في لغة Python لتخزين البيانات وتنظيمها

ما هي Tuple و List في Python؟

كل من Tuple وList هما هياكل بيانات مدمجة في Python. وتكمن وظيفتهما في تخزين مجموعة مرتبة من عنصر واحد أو أكثر داخل متغير واحد، مما يسهل تنظيم البيانات والوصول إليها.

يمكنك التحقق من نوع الكائن باستخدام الدالة المدمجة type()، وهي خطوة مفيدة جداً أثناء الاختبار أو debugging.

>>> type(my_tuple)
<class 'tuple'>

أوجه التشابه بين Tuple و List في Python

1. كلاهما يخزن عدة عناصر داخل متغير واحد

يمكن أن تكون Tuple أو List فارغة، أو تحتوي على عنصر واحد، أو عدة عناصر. الفرق الأساسي هنا يكون في الصياغة:

  • يتم تعريف Tuple باستخدام الأقواس الدائرية ().
  • يتم تعريف List باستخدام الأقواس المربعة [].

إنشاء Tuple فارغة:

>>> type(())
<class 'tuple'>

>>> my_tuple = ()
>>> type(my_tuple)
<class 'tuple'>

>>> my_tuple = tuple()
>>> type(my_tuple)
<class 'tuple'>

إنشاء List فارغة:

>>> type([])
<class 'list'>

>>> my_list = []

>>> my_list = list()

2. التعامل مع عنصر واحد يختلف في Tuple

عند إنشاء Tuple تحتوي على عنصر واحد فقط، يجب إضافة فاصلة بعد العنصر، وإلا فلن تعتبره Python كائناً من نوع tuple.

>>> age = (28,)

وعند استخدام tuple() يجب الانتباه إلى البنية الصحيحة:

>>> age = tuple((28,))
>>> type(age)
<class 'tuple'>

أما إذا حذفت الفاصلة:

>>> age = (28)
>>> type(age)
<class 'int'>

وفي المقابل، إنشاء List بعنصر واحد لا يحتاج إلى هذه الملاحظة:

>>> age = [28]
>>> type(age)
<class 'list'>

3. يمكنهما تخزين أنواع بيانات متشابهة أو مختلفة

تستطيع تخزين سلاسل نصية فقط، أو أرقام فقط، أو قيم منطقية فقط، كما يمكنك أيضاً مزج أكثر من نوع بيانات داخل نفس List أو Tuple.

>>> my_information = ["Dionysia", 27, True, "Lemonaki", 7, "Python", False]

>>> my_information = list(("Dionysia", 27, True, "Lemonaki", 7, "Python", False))
>>> print(my_information)
['Dionysia', 27, True, 'Lemonaki', 7, 'Python', False]

4. يدعمان القيم المكررة

كل من Tuple وList يسمحان بتكرار العناصر، ولا يشترطان أن تكون القيم فريدة.

>>> information = ("Jimmy", 50, True, "Kate", 50)
>>> print(information)
('Jimmy', 50, True, 'Kate', 50)

>>> my_information = ["Dionysia", 27, True, "Lemonaki", 7, "Python", False, 27, "Python", 27]

وفي حال نسيت الفواصل بين العناصر، ستظهر لك SyntaxError:

>>> information = ("Jimmy" 50, True, "Kate", 50)
File "<stdin>", line 1
SyntaxError: invalid syntax
>>> my_information = ["Dionysia" 28, True, "Lemonaki", 7, "Python", False]
File "<stdin>", line 1
SyntaxError: invalid syntax

5. يمكن معرفة عدد العناصر باستخدام len()

لحساب طول Tuple أو List وعدد العناصر داخلهما، استخدم len().

>>> my_information = ["Dionysia", 27, True, "Lemonaki", 7, "Python", False]
>>> len(my_information)
7

6. كلاهما يدعم unpacking

عند إنشاء Tuple أو List، فأنت فعلياً تقوم بتجميع عدة قيم داخل متغير واحد. ويمكن بعد ذلك فك هذه القيم وإسنادها إلى متغيرات مستقلة.

>>> front_end = ("html", "css", "javascript")
>>> content, styling, interactivity = front_end
>>> content
'html'
>>> styling
'css'
>>> interactivity
'javascript'

لكن يجب أن يكون عدد المتغيرات مطابقاً تماماً لعدد العناصر، وإلا ستحصل على خطأ:

>>> front_end = ("html", "css", "javascript")
>>> content, styling = front_end
Traceback (most recent call last):
ValueError: too many values to unpack (expected 2)
>>> front_end = ("html", "css", "javascript")
>>> content, styling, interactivity, data = front_end
Traceback (most recent call last):
ValueError: not enough values to unpack (expected 4, got 3)

7. الوصول إلى العناصر يتم عبر index

بما أن Tuple وList يحتفظان بترتيب العناصر، فيمكن الوصول إلى أي عنصر باستخدام index. وتبدأ الفهرسة في Python من الرقم 0.

>>> names = ("Jimmy", "Timmy", "John", "Kate")
>>> names[2]
'John'
>>> programming_languages = ["Python", "JavaScript", "Java", "C"]
>>> programming_languages[0]
'Python'
>>> programming_languages[1]
'JavaScript'

الفرق بين Tuple و List في Python

Tuple ثابتة Immutable

الفرق الأهم أن Tuple كائن immutable، أي لا يمكن تعديل العناصر داخله بعد إنشائه. لا يمكنك تغيير عنصر، أو حذفه، أو إضافة عنصر جديد إليه.

>>> names = ("Jimmy", "Timmy", "John", "Kate")
>>> names[2] = "Kelly"
Traceback (most recent call last):
TypeError: 'tuple' object does not support item assignment

وهذا يعني أيضاً أن طول Tuple يظل ثابتاً طوال دورة حياة البرنامج.

متى تستخدم Tuple؟

  • عندما تكون البيانات ثابتة ولا يجب تغييرها.
  • عندما تريد حماية القيم من التعديل غير المقصود.
  • عندما تحتاج إلى عناصر قابلة للاستخدام داخل dictionary أو set بشرط أن تكون غير قابلة للتغيير.
  • عندما يكون الهدف التعبير عن مجموعة بيانات ثابتة مثل الإحداثيات أو إعدادات ثابتة.

List قابلة للتعديل Mutable

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

لهذا السبب تُستخدم List عندما تكون البيانات ديناميكية ومتغيرة أثناء تشغيل البرنامج.

متى تستخدم List؟

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

كيف تعدّل List في Python؟

تحديث عنصر داخل List

يمكنك تعديل عنصر محدد عبر index ثم إسناد قيمة جديدة له.

# general syntax
>>> list_name[index] = new_value

>>> programming_languages = ["Python", "JavaScript", "Java", "C"]
>>> print(programming_languages)
['Python', 'JavaScript', 'Java', 'C']

>>> programming_languages[2] = "C++"
>>> print(programming_languages)
['Python', 'JavaScript', 'C++', 'C']

إضافة عناصر إلى List

توفر Python عدة دوال مدمجة لإضافة عناصر إلى List:

  • .append() لإضافة عنصر واحد في نهاية القائمة.
  • .insert() لإضافة عنصر في موضع محدد.
  • .extend() لإضافة مجموعة عناصر دفعة واحدة.
# append()
>>> list_name.append(item)
>>> programming_languages = ["Python", "JavaScript", "Java", "C"]
>>> programming_languages.append("C++")
>>> print(programming_languages)
['Python', 'JavaScript', 'Java', 'C', 'C++']
# insert()
>>> list_name.insert(index, item)
>>> names = ["Cody", "Dillan", "James", "Nick"]
>>> names.insert(0, "Stephanie")
>>> print(names)
['Stephanie', 'Cody', 'Dillan', 'James', 'Nick']
# extend()
>>> list_name.extend(iterable)
>>> programming_languages = ["Python", "JavaScript"]
>>> more_programming_languages = ["Java", "C"]
>>> programming_languages.extend(more_programming_languages)
>>> print(programming_languages)
['Python', 'JavaScript', 'Java', 'C']

حذف عناصر من List

هناك أكثر من طريقة لحذف العناصر من List:

  • .remove() تحذف أول ظهور للقيمة المحددة.
  • .pop() تحذف عنصراً حسب index أو تحذف آخر عنصر إذا لم يتم تمرير أي قيمة.
# remove()
>>> list_name.remove(item)
>>> programming_languages = ["Python", "JavaScript", "Java", "C"]
>>> programming_languages.remove("Java")
>>> print(programming_languages)
['Python', 'JavaScript', 'C']
# deletes only first occurrence
>>> programming_languages = ["Python", "JavaScript", "Java", "C", "Python"]
>>> programming_languages.remove("Python")
>>> print(programming_languages)
['JavaScript', 'Java', 'C', 'Python']
>>> programming_languages = ["Python", "JavaScript", "Java", "C"]
>>> programming_languages.pop()
'C'
>>> print(programming_languages)
['Python', 'JavaScript', 'Java']
>>> programming_languages = ["Python", "JavaScript", "Java", "C"]
>>> fave_language = programming_languages.pop(0)
>>> print(fave_language)
Python

مقارنة سريعة بين Tuple و List

المعيار Tuple List
قابلية التعديل غير قابلة للتعديل قابلة للتعديل
الصياغة () []
الإضافة والحذف غير مدعوم مباشرة مدعوم
عدد الدوال المدمجة أقل أكثر
أفضل استخدام البيانات الثابتة البيانات المتغيرة

كيف تختار بين Tuple و List في مشروعك؟

اختيارك بين Tuple وList يجب أن يعتمد على طبيعة البيانات نفسها، وليس فقط على الشكل البرمجي:

  1. إذا كانت البيانات ثابتة ولا يُفترض أن تتغير، فاستخدم Tuple.
  2. إذا كانت البيانات تحتاج إلى تحديث مستمر، فاستخدم List.
  3. إذا كنت تريد توضيح نية الكود للمطورين الآخرين، فإن استخدام Tuple قد يكون إشارة واضحة إلى أن البيانات يجب أن تبقى ثابتة.
  4. إذا كنت تتعامل مع مجموعة عناصر سيتم معالجتها وإعادة بنائها باستمرار، فإن List خيار عملي أكثر.

الخلاصة التقنية

رغم أن Tuple وList يشتركان في كثير من الخصائص داخل Python، فإن الفرق الجوهري بينهما هو immutability مقابل mutability. من الناحية العملية، استخدم Tuple لتمثيل البيانات الثابتة التي يجب الحفاظ عليها كما هي، واستخدم List عندما تحتاج إلى المرونة في الإضافة والحذف والتعديل. هذا الاختيار البسيط ينعكس على وضوح الكود، وسلامة البيانات، وسهولة صيانة المشروع على المدى الطويل.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *