«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему при переборе списка Python следует избегать удаления элементов?

Почему при переборе списка Python следует избегать удаления элементов?

Опубликовано 18 ноября 2024 г.
Просматривать:677

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

Списки Python: подводные камни удаления элементов во время итерации

Итерация по списку Python с одновременным удалением элементов может привести к неожиданному поведению. Ярким примером является следующий:

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

Как ни странно, окончательный отпечаток букв показывает, что были удалены только все остальные элементы.

Причина аномалии

Такое поведение связано с тем, как Python обрабатывает изменения в итерациях во время итерации. В документации прямо указано, что изменение повторяемой последовательности, как правило, небезопасно, особенно для изменяемых типов, таких как списки.

Такая практика может привести к неопределенному поведению и потенциальным изменениям в будущих сборках Python.

Правильный подход к удалению всех элементов

Чтобы безопасно удалить все элементы из списка, используйте любой из следующих методов:

  • del Letters[:] для удаления всех элементы и ссылки на объект списка.
  • letters[:] = [] для присвоения нового пустого списка существующей переменной, оставляя ссылки на исходный объект нетронутыми.
  • letters = [] чтобы создать новый пустой список и назначить его новой переменной.

Обработка условного удаления элементов

Для условного удаления элементов создайте копию список с использованием синтаксиса фрагмента [:]:

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