قوائم بايثون: مخاطر إزالة العناصر أثناء التكرار
يمكن أن يؤدي التكرار عبر قائمة بايثون أثناء إزالة العناصر بشكل متزامن إلى سلوك غير متوقع. ومن الأمثلة البارزة ما يلي:
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']
for i in letters:
letters.remove(i)
من المثير للحير أن النسخة النهائية من الرسائل تكشف أنه تمت إزالة كل العناصر الأخرى فقط.
سبب الشذوذ
ينبع هذا السلوك من الطريقة التي تتعامل بها بايثون مع تعديلات العناصر القابلة للتكرار أثناء التكرار. تنص الوثائق صراحة على أن تعديل التسلسل الذي يتم تكراره غير آمن بشكل عام، خاصة بالنسبة للأنواع القابلة للتغيير مثل القوائم.
يمكن أن تؤدي هذه الممارسة إلى سلوك غير محدد وتغييرات محتملة في إصدارات بايثون المستقبلية.
الطريقة الصحيحة لإزالة كافة العناصر
لإزالة جميع العناصر من القائمة بأمان، استخدم أي من الطرق التالية:
التعامل مع إزالة العناصر المشروطة
للإزالة المشروطة للعناصر، قم بإنشاء نسخة من القائمة باستخدام بناء جملة الشريحة [:]: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)] تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3