← Все вопросы

TypeError: 'NoneType' object is not iterable — почему нельзя пройтись циклом?

Задан 7 месяцев назад1.4к просмотров2 ответа
9

Делаю for x in result:, а вылетает TypeError: 'NoneType' object is not iterable. Откуда взялся None, если я перебираю результат своей функции? Как избавиться от этой ошибки?

2 ответа

13
✓ Принятый ответ — помог автору

Ошибка значит: вы пытаетесь перебрать 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:

  1. Методы, меняющие список на месте и возвращающие None: lst = lst.sort() или lst = lst.append(x) — теперь lst это None. Не присваивайте результат таких методов.
  2. dict.get(key) для отсутствующего ключа возвращает None.
  3. Функция с return только в одной ветке if, а в остальных молча отдаёт None.

Совет: перед циклом проверьте print(type(result)). Если там <class 'NoneType'>, ищите функцию или присваивание, которое дало None.

5

Самая частая разовая причина — x = mylist.sort(). Метод sort() сортирует список на месте и возвращает None. Правильно так:

mylist.sort()      # меняет сам список
# или
x = sorted(mylist) # возвращает новый отсортированный список

После этого for по списку заработает.

Ваш ответ

Войдите, чтобы ответить на вопрос.