Python Math - TypeError: объект "NoneType" не подлежит расшифровке

Я делаю небольшую программу для математики (нет особой причины, просто хотелось), и я столкнулся с ошибкой "TypeError: объект" NoneType "не подлежит расшифровке.

Я никогда раньше не видел эту ошибку, поэтому я понятия не имею, что это значит.

import math

print("The format you should consider:")
print str("value 1a")+str(" + ")+str("value 2")+str(" = ")+str("value 3a ")+str("value 4")+str("\n")

print("Do not include the letters in the input, it automatically adds them")

v1 = input("Value 1: ")
v2 = input("Value 2: ")
v3 = input("Value 3: ")
v4 = input("Value 4: ")

lista = [v1, v3]
lista = list.sort(lista)

a = lista[1] - lista[0]

list = [v2, v4]
list = list.sort(list)

b = list[1] = list[0]

print str(a)+str("a")+str(" = ")+str(b)

Ошибка:

Traceback (most recent call last):
  File "C:/Users/Nathan/Documents/Python/New thing", line 16, in <module>
    a = lista[1] - lista[0]
TypeError: 'NoneType' object is not subscriptable

Ответ 1

lista = list.sort(lista)

Это должно быть

lista.sort()

Метод .sort() находится на месте и возвращает None. Если вы хотите что-то не на месте, которое возвращает значение, вы можете использовать

sorted_list = sorted(lista)

Помимо # 1: пожалуйста, не вызывайте свои списки list. Это clobbers встроенный тип списка.

Помимо # 2: я не уверен, что должна делать эта строка:

print str("value 1a")+str(" + ")+str("value 2")+str(" = ")+str("value 3a ")+str("value 4")+str("\n")

это просто

print "value 1a + value 2 = value 3a value 4"

? Другими словами, я не знаю, почему вы вызываете str на вещи, которые уже являются str.

Помимо # 3: иногда вы используете print("something") (синтаксис Python 3), а иногда используете print "something" (Python 2). Последний даст вам SyntaxError в py3, поэтому вы должны запустить 2. *, и в этом случае вы, вероятно, не захотите входить в привычку, или вы завершите печать кортежей, с дополнительными скобками. Я признаю, что он будет работать достаточно хорошо, потому что если в круглых скобках есть только один элемент, он не интерпретируется как кортеж, но он выглядит странным для пифонического глаза.

Ответ 2

Исключение TypeError: 'NoneType' object is not subscriptable происходит потому, что значение lista на самом деле None. Вы можете воспроизвести TypeError, который вы получите в своем коде, если вы попробуете это в командной строке Python:

None[0]

Причина, по которой lista устанавливается в None, заключается в том, что возвращаемое значение list.sort() равно None... оно не возвращает отсортированную копию исходного списка. Вместо этого, как указано в , список сортируется на месте вместо сделанной копии (это по соображениям эффективности).

Если вы не хотите изменять исходную версию, вы можете использовать

other_list = sorted(lista)

Ответ 3

По этой ссылке https://docs.python.org/2/tutorial/datastructures.html вы можете прочитать этот метод "Сортировка элементов списка на месте", это означает, что значение результата будет отсортировано, а результат будет включен сам. Функция возвращает None.

Когда вы присваиваете результат "lista" в строке 14

lista = list.sort(lista)

Вы устанавливаете его на None. Это ошибка. Ни один всегда не имеет данных и не может быть подписным. "TypeError: объект" NoneType "не может быть подписан"

чтобы исправить эту ошибку (для сортировки списка), сделайте это в строке 14:

lista.sort() # this will sort the list in line

Но есть и другие ошибки: в строке 18 при назначении:

list = [v2, v4]

Вы закрываете этот встроенный тип "список", и вы получите следующую ошибку:

TypeError: 'list' object is not callable

Чтобы исправить это, скажите:

lista2 = [v2, v4]

Снова в строке 19 та же ошибка строки 14. Сделайте это, чтобы отсортировать другой список:

lista2.sort()

В строке 21 вы пытаетесь проиндексировать встроенный список типов. Чтобы исправить это:

b = lista2[1] = lista2[0]

С этим ваш код будет работать нормально. Наконец весь правильный код:

import math

print("The format you should consider:")
print str("value 1a")+str(" + ")+str("value 2")+str(" = ")+str("value 3a ")+str("value 4")+str("\n")

print("Do not include the letters in the input, it automatically adds them")

v1 = input("Value 1: ")
v2 = input("Value 2: ")
v3 = input("Value 3: ")
v4 = input("Value 4: ")

lista = [v1, v3]
lista.sort()

a = lista[1] - lista[0]

lista2 = [v2, v4]
lista2.sort()

b = lista2[1] = lista2[0]

print str(a)+str("a")+str(" = ")+str(b)

Ответ 4

Как было сказано ранее в одном из ответов, эта ошибка возникает, когда значение списка оказывается пустым. Хотя это не совсем относится к этому вопросу, у меня возникла та же ошибка при чтении изображений с использованием opencv и numpy, поскольку было обнаружено, что имя файла отличается от указанного, вероятно, или потому, что рабочий каталог не был указан правильно.