Выбор ответа Middle Коллекции обновлено

Удаление ключей во время итерации

Вопрос

Что произойдёт при выполнении кода?

d = {'a': 0, 'b': 1, 'c': 0}
for k in d:
    if d[k] == 0:
        del d[k]

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: RuntimeError: dictionary changed size during iteration. Менять размер словаря при обходе нельзя, CPython это отслеживает и бросает RuntimeError.

Варианты ответа

  1. Удалятся все ключи с нулевым значением, останется b
  2. Удалится только первый ключ с нулём, остальные пропустятся
  3. RuntimeError: dictionary changed size during iterationправильный ответ
  4. Цикл зациклится на удалённом ключе

Разбор

Менять размер словаря при обходе нельзя, CPython это отслеживает и бросает RuntimeError. Правильно обходить копию ключей: for k in list(d):, или собрать новый словарь comprehension-ом: {k: v for k, v in d.items() if v}. Тихий пропуск элементов характерен для удаления из списка во время итерации, а не для словаря.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.