TypeError: 'NoneType' object cannot be interpreted as an integer. Python 3

Я новичок в программировании. Решил написать алгоритм сортировки выбором:

def findSmallest(arr):
    smallest = arr[0]
    smallest_index = 0
    for i in range(1, len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
        return smallest_index

def selectionSort(arr):
    newArr = []
    for i in range(len(arr)):
        smallest = findSmallest(arr)
        newArr.append(arr.pop(smallest))
    return newArr

a = [5, 3, 6, 2, 10]
print(selectionSort(a))

Выдало такую ошибку:

Traceback (most recent call last):
  File "sort_by_selection.py", line 19, in <module>
    print(selectionSort(a))
  File "sort_by_selection.py", line 14, in selectionSort
    newArr.append(arr.pop(smallest))
TypeError: 'NoneType' object cannot be interpreted as an integer

Почему возникает эта ошибка и как ее исправить?


Ответы (1 шт):

Автор решения: SmellyNS

Почему TypeError: на последнем проходе цикла в selectionSort() у вас уже len(arr) всегда будет равен единице (это компилятор в голове, на практике не проверял). Таким образом, функция findSmallest() ничего не вернет, так как итератор range(1,1) является пустым и из-за этого в цикл for i in range(1, len(arr)) мы просто не зайдем. Без ключевого слова return функция возвращает None, а дальше вы пытаетесь выполнить arr.pop(None), что и вызывает эту ошибку.

>>> [1].pop()
1
>>> [1].pop(None)
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    [1].pop(None)
TypeError: 'NoneType' object cannot be interpreted as an integer

Решение: проверяйте условие длины массива меньше двух.

Также вынесите return smallest_index за тело цикла. Тут вы просто ошиблись и иначе результат будет неверный.

→ Ссылка