71

我正在为数学制作一个小程序(没有特别的原因,只是有点想要),我遇到了错误“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

4 回答 4

65
lista = list.sort(lista)

这应该是

lista.sort()

.sort()方法是就地的,并返回无。如果你想要一些不就地的东西,它会返回一个值,你可以使用

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)。后者会在 py3 中给你一个 SyntaxError,所以你必须运行 2.*,在这种情况下你可能不想养成这个习惯,否则你会用额外的括号打印元组。我承认它在这里工作得很好,因为如果括号中只有一个元素,它不会被解释为元组,但它看起来很奇怪。

于 2012-02-16T23:36:29.977 回答
33

发生异常TypeError: 'NoneType' object is not subscriptable是因为 的值lista实际上是None。如果您在 Python 命令行中尝试此操作,则可以重现TypeError您在代码中获得的内容:

None[0]

lista设置为 None 的原因是返回值is list.sort()...None它不返回原始列表的排序副本。相反,正如文档指出的那样,列表被就地排序而不是复制(这是出于效率原因)。

如果您不想更改原始版本,可以使用

other_list = sorted(lista)
于 2012-02-16T23:45:53.777 回答
0

在此链接https://docs.python.org/2/tutorial/datastructures.html您可以阅读此方法“对列表中的项目进行排序”这意味着结果值将排序并且结果将打开本身。该函数返回无。

当您在第 14 行将结果分配给“lista”时

lista = list.sort(lista)

您将其设置为无。这就是错误。None 总是没有数据,不能下标。“TypeError:‘NoneType’对象不可下标”

要更正此错误(用于对列表进行排序),请在第 14 行执行此操作:

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

但还有其他一些错误:在第 18 行分配时:

list = [v2, v4]

你clob这个内置类型“list”,你会得到以下错误:

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)
于 2018-05-06T05:58:08.623 回答
0

正如前面在其中一个答案中所说,当列表的值结果为空时会发生此错误。好吧,虽然与这个问题不完全相关,但我在使用 opencv 和 numpy 读取图像时发生了同样的错误,因为发现文件名可能与指定的不同,或者因为工作目录没有正确指定。

于 2019-01-02T05:05:56.853 回答