Python Math - TypeError: объект 'NoneType' не может быть подписан - PullRequest
43 голосов
/ 17 февраля 2012

Я делаю небольшую программу по математике (без особой причины, просто хотел), и я столкнулся с ошибкой «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

Ответы [ 4 ]

41 голосов
/ 17 февраля 2012
lista = list.sort(lista)

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

lista.sort()

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

sorted_list = sorted(lista)

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

В стороне # 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. *, и в этом случае вы, вероятно, не захотите получать привычку, или вы получите печать кортежей с дополнительными скобками.Я признаю, что здесь это будет работать достаточно хорошо, потому что если в скобках есть только один элемент, он не интерпретируется как кортеж, но выглядит странным для глаз питона ..

25 голосов
/ 17 февраля 2012

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

None[0]

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

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

other_list = sorted(lista)
0 голосов
/ 02 января 2019

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

0 голосов
/ 06 мая 2018

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

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

lista = list.sort(lista)

Вы устанавливаете значение None. Это ошибка. Ни один всегда не имеет данных и не может быть subscriptable. «Ошибка типа: объект« 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)
...