"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > عند التكرار عبر قائمة بايثون، لماذا يجب عليك تجنب إزالة العناصر؟

عند التكرار عبر قائمة بايثون، لماذا يجب عليك تجنب إزالة العناصر؟

تم النشر بتاريخ 2024-11-18
تصفح:401

When Iterating Through a Python List, Why Should You Avoid Removing Items?

قوائم بايثون: مخاطر إزالة العناصر أثناء التكرار

يمكن أن يؤدي التكرار عبر قائمة بايثون أثناء إزالة العناصر بشكل متزامن إلى سلوك غير متوقع. ومن الأمثلة البارزة ما يلي:

letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']
for i in letters:
    letters.remove(i)

من المثير للحير أن النسخة النهائية من الرسائل تكشف أنه تمت إزالة كل العناصر الأخرى فقط.

سبب الشذوذ

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

يمكن أن تؤدي هذه الممارسة إلى سلوك غير محدد وتغييرات محتملة في إصدارات بايثون المستقبلية.

الطريقة الصحيحة لإزالة كافة العناصر

لإزالة جميع العناصر من القائمة بأمان، استخدم أي من الطرق التالية:

  • del letters[:] لحذف الكل العناصر والمراجع إلى كائن القائمة.
  • letters[:] = [] لتعيين قائمة فارغة جديدة للمتغير الموجود، مع ترك الإشارات إلى الكائن الأصلي سليمة.
  • letters = [] لإنشاء قائمة فارغة جديدة وتعيينها لمتغير جديد.

التعامل مع إزالة العناصر المشروطة

للإزالة المشروطة للعناصر، قم بإنشاء نسخة من القائمة باستخدام بناء جملة الشريحة [:]:

commands = ["ls"، "cd"، "rm -rf /"] لـ cmd في الأوامر[:]: إذا كان "rm" في cmd: Commands.remove(cmd)
commands = ["ls", "cd", "rm -rf /"]
for cmd in commands[:]:
    if "rm " in cmd:
        commands.remove(cmd)

commands = [cmd for cmd in Commands if not is_malicious(cmd)]
            
بيان الافراج أعيد طبع هذه المقالة على: 1729301595 في حالة وجود أي انتهاك، يرجى الاتصال بـ [email protected] لحذفها
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3