你是否遇到了以下错误信息?
TypeError: NoneType is not subscriptable
你并不孤单!这个简短的教程将告诉你为什么会出现这个错误,如何修复它,以及如何不再犯同样的错误。
所以,让我们开始吧!
摘要
如果你试图对x[i] 或切分x[i:j] 一个None 的值进行索引,Python就会引发TypeError: NoneType is not subscriptable 。None 类型是不可索引的,也就是说,它没有定义 [__getitem__()](https://blog.finxter.com/python-__getitem__-magic-method/)方法。你可以通过删除索引或切片的调用,或者定义__getitem__ 方法来解决这个问题。
例子

下面是导致该错误的最小例子。
x = None
print(x[0])
# TypeError: 'NoneType' object is not subscriptable
你将variable 设置为值None 。值None 不是一个容器对象,它不包含 其他对象。所以,这段代码真的没有任何意义--你期望从索引操作中得到哪种结果?
练习一下。在我告诉你如何解决这个问题之前,请尝试在下面的交互式外壳中自己解决这个错误。
如果你对Python中的索引操作感到挣扎,请看看Finxter博客上的以下文章--特别是第三篇!
修复
你可以通过将非可索引的值包装成一个容器数据类型,如Python中的列表 ,来解决 非下标的TypeError 问题。
x = [None]
print(x[0])
# None
现在输出的值是None ,而且脚本不再产生错误信息了。
一个替代方法是在你的代码中定义__getitem__() 方法。
class X:
def __getitem__(self, i):
return f"Value {i}"
variable = X()
print(variable[0])
# Value 0
你覆盖了__getitem__ 方法,该方法需要一个(索引)参数i (除了强制性的 [self](https://blog.finxter.com/self-in-python/ "Python Self — An Interactive Guide with Video")参数),并返回 "容器 "的第i 个值。
在我们的例子中,我们只是为元素variable[0] 返回一个字符串"Value 0" ,为元素variable[10] 返回一个字符串"Value 10" 。