دليلك الشامل لإنشاء قائمة فارغة في بايثون: مقارنة بين `[]` و `list()`

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

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

في هذا الدليل، ستتعلم:

  • كيفية إنشاء قائمة فارغة باستخدام الأقواس المربعة [].
  • كيفية إنشاء قائمة فارغة باستخدام دالة البناء list().
  • سيناريوهات الاستخدام المثلى لكلتا الطريقتين.
  • مقارنة كفاءتهما (إحداهما أسرع من الأخرى!).
  • سنستخدم وحدة timeit المدمجة في بايثون لمقارنة أدائهما بدقة.

دعنا نبدأ رحلتنا في عالم القوائم الفارغة في بايثون!

إنشاء قائمة فارغة باستخدام الأقواس المربعة []

تُعد الأقواس المربعة الفارغة [] الطريقة الأكثر شيوعًا وبساطة لإنشاء قائمة فارغة في بايثون. إنها بمثابة اختصار مباشر وفعال يخبر مفسر بايثون بإنشاء كائن قائمة جديد لا يحتوي على أي عناصر.

مثال على إنشاء قائمة بايثون فارغة باستخدام الأقواس المربعة

نصيحة: عادةً ما نقوم بتعيين القائمة الفارغة لمتغير حتى نتمكن من استخدامها والتفاعل معها لاحقًا في برنامجنا. على سبيل المثال:

num = []

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

>>> num = []
>>> len(num)
0

القوائم الفارغة كقيم زائفة (Falsy Values)

في سياق بايثون، تُعتبر القوائم الفارغة قيمًا زائفة (Falsy values). هذا يعني أنها تُقيَّم إلى False عند استخدامها في سياق منطقي (boolean context)، مثل داخل عبارة if أو عند تحويلها إلى قيمة منطقية باستخدام الدالة bool():

>>> num = []
>>> bool(num)
False

إضافة عناصر إلى قائمة فارغة

يمكنك إضافة عناصر إلى قائمة فارغة باستخدام طريقتين شائعتين هما append() و insert():

  • تضيف الدالة append() العنصر إلى نهاية القائمة.
  • تضيف الدالة insert() العنصر في فهرس محدد تختاره داخل القائمة.

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

if num:
    print("هذه القائمة ليست فارغة")
else:
    print("هذه القائمة فارغة")

سيكون ناتج هذا الكود هو:

هذه القائمة فارغة

وذلك لأن القائمة كانت فارغة، وبالتالي تم تقييمها إلى False، مما أدى إلى تنفيذ كتلة else.

بشكل عام، تعمل هذه الآلية كالتالي:

  • إذا كانت القائمة غير فارغة، تُقيَّم إلى True، ويتم تنفيذ كتلة if.
  • إذا كانت القائمة فارغة، تُقيَّم إلى False، ويتم تنفيذ كتلة else.

مثال عملي: ملء قائمة فارغة

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

>>> num = []
>>> for i in range(3, 15, 2):
...     num.append(i)

بعد تنفيذ الحلقة، نتحقق من قيمة المتغير num للتأكد من إضافة العناصر بنجاح وتأكيد أن القائمة لم تعد فارغة:

>>> num
[3, 5, 7, 9, 11, 13]

نصيحة: على الرغم من أننا نستخدم append() بشكل شائع لإضافة العنصر الأول إلى قائمة فارغة، إلا أنه يمكنك أيضًا إضافة هذا العنصر باستدعاء الدالة insert() مع الفهرس 0:

>>> num = []
>>> num.insert(0, 1.5) # إضافة العدد العشري 1.5 في الفهرس 0
>>> num
[1.5]

إنشاء قائمة فارغة باستخدام دالة البناء list()

بدلاً من الأقواس المربعة، يمكنك إنشاء قائمة فارغة باستخدام دالة البناء (type constructor) list(). تُنشئ هذه الدالة كائن قائمة جديدًا. وفقًا لتوثيق بايثون الرسمي:

إذا لم يتم تمرير أي وسيط، تُنشئ دالة البناء قائمة فارغة جديدة، [].

مثال على إنشاء قائمة بايثون فارغة باستخدام دالة البناء list()

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

num = list()

مثل القائمة التي تم إنشاؤها باستخدام الأقواس المربعة، سيكون طول هذه القائمة الفارغة 0:

>>> num = list()
>>> len(num)
0

وهي أيضًا قيمة زائفة (falsy value) عندما تكون فارغة، مما يعني أنها تُقيَّم إلى False في سياق منطقي:

>>> num = list()
>>> bool(num)
False

مثال: استخدام list() لإضافة عناصر

هذه القائمة وظيفية بالكامل، ويمكننا إضافة عناصر إليها تمامًا كما نفعل مع القوائم التي تم إنشاؤها باستخدام []:

>>> num = list()
>>> for i in range(3, 15, 2):
...     num.append(i)

وستكون النتيجة قائمة غير فارغة، كما يتضح هنا:

>>> num
[3, 5, 7, 9, 11, 13]

متى نستخدم كل طريقة؟ (Use Cases)

عادةً ما نستخدم دالة البناء list() لإنشاء قوائم من كائنات قابلة للتكرار (iterables) موجودة مسبقًا، مثل السلاسل النصية (strings)، القواميس (dictionaries)، أو المجموعات (tuples). على سبيل المثال، لتحويل سلسلة نصية إلى قائمة من الأحرف، يمكنك استخدام list('hello').

أما الأقواس المربعة []، فستجدها تُستخدم بشكل شائع جدًا لإنشاء قوائم فارغة في بايثون لأن هذا التركيب اللغوي أكثر إيجازًا ووضوحًا، وكما سنرى لاحقًا، فهو أسرع أيضًا.

مقارنة الكفاءة: [] مقابل list()

ذكرنا سابقًا أن استخدام [] أسرع من list(). ولكن ما مدى سرعة الفارق بينهما؟ دعنا نتحقق من كفاءتهما الزمنية باستخدام وحدة timeit المدمجة في بايثون.

لاستخدام هذه الوحدة في برنامج بايثون الخاص بك، تحتاج إلى استيرادها أولاً:

>>> import timeit

على وجه التحديد، سنستخدم الدالة timeit.timeit() من هذه الوحدة، والتي يمكنك استدعاؤها بهذا التركيب:

شرح استخدام دالة timeit.timeit() لمقارنة الأداء في بايثون

نصيحة: يتم تكرار الكود عدة مرات (عبر المعامل number) لتقليل الفروقات الزمنية التي قد تنشأ عن عوامل خارجية مثل العمليات الأخرى التي قد تكون قيد التشغيل في تلك اللحظة. هذا يجعل النتائج أكثر موثوقية لأغراض المقارنة.

الاختبار والنتائج

لنبدأ الاختبار ونرى النتائج:

أولاً، نستورد الوحدة:

>>> import timeit

ثم، نبدأ باختبار كل تركيب:

اختبار []:

>>> timeit.timeit('[]', number=10**4)
0.0008467000000109692

اختبار list():

>>> timeit.timeit('list()', number=10**4)
0.002867799999989984

نصيحة: لاحظ أن الكود الذي تريد قياس وقته يجب أن يكون محاطًا بعلامات اقتباس فردية '' أو مزدوجة "". الوقت الذي تُرجعه الدالة timeit() يُعبر عنه بالثواني.

تحليل النتائج

لنقارن هذه النتائج:

  • []: 0.0008467000000109692 ثانية
  • list(): 0.002867799999989984 ثانية

يتضح لنا أن [] أسرع بكثير من list(). كان هناك فرق يقارب 0.002 ثانية في هذا الاختبار:

>>> 0.002867799999989984 - 0.0008467000000109692
0.0020210999999790147

قد تتساءل الآن: لماذا تُعتبر list() أقل كفاءة من [] إذا كانتا تؤديان نفس الغرض تمامًا؟

السبب هو أن list() أبطأ لأنها تتطلب البحث عن اسم الدالة، ثم استدعاءها، ومن ثم إنشاء كائن القائمة في الذاكرة. في المقابل، تُعد [] بمثابة “اختصار” لا يتطلب العديد من الخطوات الوسيطة لإنشاء القائمة في الذاكرة.

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

ملخص شامل

يمكنك إنشاء قائمة فارغة في بايثون باستخدام طريقتين رئيسيتين: إما باستخدام زوج من الأقواس المربعة الفارغة []، أو باستخدام دالة البناء list()، وهي دالة مدمجة تُنشئ قائمة فارغة عندما لا يتم تمرير أي وسائط إليها.

تُستخدم الأقواس المربعة [] بشكل شائع جدًا لإنشاء القوائم الفارغة في بايثون لأنها طريقة أسرع وأكثر إيجازًا ووضوحًا في الكود.

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

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

تُفضل الأقواس المربعة [] بشكل عام لإنشاء القوائم الفارغة نظرًا لبساطتها وسرعتها الفائقة، والتي تنبع من كونها جزءًا مباشرًا من بناء الجملة (syntax) للغة، مما يلغي الحاجة إلى استدعاء دالة. في المقابل، تُعد list() أكثر مرونة عندما يتعلق الأمر بتحويل أنواع بيانات أخرى إلى قوائم، ولكنها تحمل عبئًا إضافيًا بسبب عملية استدعاء الدالة.

لتحقيق أفضل أداء وقابلية صيانة للكود، يوصى باستخدام [] عند الحاجة إلى قائمة فارغة تمامًا، والاحتفاظ بـ list() للحالات التي تتطلب تحويل كائن قابل للتكرار إلى قائمة.

اترك تعليقاً

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