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, поскольку было обнаружено, что имя файла отличается от указанного, вероятно, или потому, что рабочий каталог не был указан правильно.