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 шт):
Почему 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 за тело цикла. Тут вы просто ошиблись и иначе результат будет неверный.