TypeError: 'NoneType' object is not iterable — почему нельзя пройтись циклом?
Делаю for x in result:, а вылетает TypeError: 'NoneType' object is not iterable. Откуда взялся None, если я перебираю результат своей функции? Как избавиться от этой ошибки?
2 ответа
Ошибка значит: вы пытаетесь перебрать None, а None — это «ничего», по нему нельзя пройти циклом. Почти всегда виноват результат функции, которая вернула None вместо списка.
Классика — функция, где забыли return, либо где return не сработал:
def get_items():
items = [1, 2, 3]
# забыли return!
for x in get_items(): # get_items() == None → ошибка
print(x)
Исправление — вернуть значение:
def get_items():
items = [1, 2, 3]
return items
Другие источники None:
- Методы, меняющие список на месте и возвращающие None:
lst = lst.sort()илиlst = lst.append(x)— теперьlstэто None. Не присваивайте результат таких методов. dict.get(key)для отсутствующего ключа возвращает None.- Функция с
returnтолько в одной веткеif, а в остальных молча отдаёт None.
Совет: перед циклом проверьте print(type(result)). Если там <class 'NoneType'>, ищите функцию или присваивание, которое дало None.
Самая частая разовая причина — x = mylist.sort(). Метод sort() сортирует список на месте и возвращает None. Правильно так:
mylist.sort() # меняет сам список
# или
x = sorted(mylist) # возвращает новый отсортированный список
После этого for по списку заработает.