Выбор ответа 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.
Варианты ответа
- Удалятся все ключи с нулевым значением, останется
b - Удалится только первый ключ с нулём, остальные пропустятся
RuntimeError: dictionary changed size during iterationправильный ответ- Цикл зациклится на удалённом ключе
Разбор
Менять размер словаря при обходе нельзя, CPython это отслеживает и бросает RuntimeError. Правильно обходить копию ключей: for k in list(d):, или собрать новый словарь comprehension-ом: {k: v for k, v in d.items() if v}. Тихий пропуск элементов характерен для удаления из списка во время итерации, а не для словаря.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.